1

使用以下方法之一时是否存在任何性能问题?哪个更快(如果有的话)?如果有任何性能测试,那就太好了。

多维数组:

// Using multidimmentional array:
int ****multidim_arr;
// ... initialization, etc. ...
int val = multidim_arr[a][b][c][d];

平面阵列:

// Using flat array (or single array)
int *flat_arr;
// ... initialization, etc. ...
int val2 = flat_arr[a * a_lvl + b * b_lvl + c * c_lvl + d];

更新:

数组具有固定大小,但内存由 malloc() 函数分配,因为在程序运行时大小是已知的。

4

2 回答 2

7

与所有性能问题一样,配置文件并查看。但是扁平阵列很可能会更快。那是因为您没有将多维数组与平面数组进行比较 - 您正在将指针数组与指向 ... 的指针数组与具有平面数组的数组进行比较。

一个多维数组将是int multidim_array[dim1][dim2][dim3][dim4]. 并且可以预期这将具有与平面阵列相同的速度。那是因为它在内存中是连续的。

另一方面,你的是基于指针的,所以每个切片都驻留在不同的内存位置,这意味着额外的提取、缓存未命中等。这几乎肯定会更慢。

于 2013-11-14T09:06:23.383 回答
3

这取决于您如何迭代元素和大小。这种情况下的性能很大程度上取决于缓存性能(命中/未命中率)。

很难一概而论。

“平面”数组往往更快,因为对元素的访问更直接。您计算一次索引。另外,“平坦”是指连续内存块,其中任意元素的索引可以在一个表达式中计算。我希望int a[X][Y][Z][W]工作速度与您手动获取索引的计算速度一样快int a[X*Y*Z*W],与编译器所做的计算相同。

真正的区别在于int**** a;

使用多维“指针”数组。这实际上是高级指针引用,您需要在每个级别上获取适当的地址。在某些情况下,这可能会严重影响性能。

于 2013-11-14T09:06:18.163 回答