今天早上我和一位同事就这个话题进行了讨论。他说,将数组分配为指针数组总是更好,因为单独分配每个元素更有机会获得空闲内存块。有点像这样:
// 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 速度和内存之间的差距每年都在扩大,从而增加了连续打包数据和批量操作的优势。
您应该阅读此问题中描述的文档每个程序员都应该了解的内存知识 https://stackoverflow.com/questions/8126311/what-every-programmer-should-know-about-memory。它详细描述了现代 CPU/内存关系的所有来龙去脉,以及为什么连续数据非常重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)