指针数组与元素数组

今天早上我和同事就这个话题进行了讨论。 他说,将数组分配为指针数组总是更好,因为分别分配每个元素有更好的机会获得一个空闲的内存块。 有人这样想:

// Consider n_elements as a dynamic value int n_elements = 10, i; int **ary = (int **) malloc(sizeof(int *) * n_elements); for(i = 0; i < n_elements; i++) { ary[i] = (int *) malloc(sizeof(int)); } 

与他的方法相反,我认为分配元素数组更好,只是因为你会获得一个紧凑的内存块而不是遍布堆的一堆引用。 像这样的东西:

 int n_elements = 10; int *ary = (int *) malloc(sizeof(int) * n_elements); ary[0] = 100; 

在这次谈话之后,我一直在思考它,我的最终结论是它取决于它。 由于上面提到的原因,我在处理小数据类型时发现第二种解决方案是更好的方法,但是当分配大型结构的数组时,第一种可能更好。

除了我的结论,你怎么看待它?

对于我能想到的任何主流硬件,他都错了。 (至少在一般情况下)。 它可能会有所不同,可能会有一些特殊情况。 尽可能在指针数组上选择元素数组。

像数据一样的CPU缓存是连续打包的。 分别分配每个元素将增加缓存未命中,减慢分配时间和浪费内存(由于分配对齐)。 CPU速度和内存之间的差距每年都在增长,从而增加了连续打包数据和批处理操作的优势。

您应该阅读本问题中描述的文档, 每位程序员应该了解内存 。 它详细描述了现代CPU /内存关系的所有细节,以及为什么连续数据非常重要。