【发布时间】:2014-03-03 18:47:36
【问题描述】:
我有两种构造二维数组的方法:
int arr[NUM_ROWS][NUM_COLS];
//...
tmp = arr[i][j]
扁平化数组
int arr[NUM_ROWS*NUM_COLS];
//...
tmp = arr[i*NuM_COLS+j];
我正在处理图像,因此即使是访问时间的一点改进也是必要的。哪个更快?我在考虑第一个,因为第二个需要计算,但是第一个需要两个寻址,所以我不确定。
【问题讨论】:
-
这没什么区别 - 在性能方面还有更重要的考虑因素,例如访问模式、步幅等。
-
一般情况下,编译器已经预先计算了所需的空间,代码调用了预先计算好的大小的分配函数。预先计算没有额外的惩罚。
-
如果要提高性能: 1) 使用在程序启动时分配的固定大小的数组。 2) 在网上搜索“数据缓存优化”以获取有关如何分配和使用 2D 数组以获得处理器数据缓存的最大性能的建议。
-
对于图像处理,您不太可能使用静态分配的数组进行图像处理。在这种情况下,您的问题取决于您如何分配动态二维数组。看我的回答。
-
@PaulR,因为这是用于图像处理,我假设 OP 需要动态数组。在这种情况下,如何分配 2D 动态数组确实会有所不同。
标签: c++ c performance