今天早上我和同事就这个话题进行了讨论。他说,将数组分配为指针数组总是更好,因为分别分配每个元素有更好的机会获得一个空闲的内存块。有人这样想:
// 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;
在这次谈话之后我一直在思考它,我的最终结论是它取决于它。由于上面提到的原因,我在处理小数据类型时发现第二种解决方案是更好的方法,但是当分配大型结构的数组时,第一种解决方案可能更好。
除了我的结论,你怎么看待它?
答案 0 :(得分:6)
对于我能想到的任何主流硬件,他都错了。 (至少一般而言)。它可能会有所不同,可能会有一些特殊情况。尽可能选择指针数组上的元素数组。
CPU缓存数据要连续打包。分别分配每个元素将增加缓存未命中,减慢分配时间和浪费内存(由于分配对齐)。 CPU速度和内存之间的差距每年都在增长,从而增加了连续打包数据和批处理操作的好处。
您应该阅读此问题What Every Programmer Should Know About Memory中描述的文档。它详细描述了现代CPU /内存关系的所有细节,以及为什么连续数据非常重要。