4

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

// 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;

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

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

4

1 回答 1

6

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

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

您应该阅读这个问题What Every Programmer Should Know About Memory中描述的文档。它详细描述了现代 CPU/内存关系的所有细节以及为什么连续数据非常重要。

于 2013-08-28T16:42:30.677 回答