众所周知,对于大多数算法而言,在堆栈上分配和释放数据比在堆上执行快得多。在C ++中,代码的区别就像
double foo[n*n]
VS
double* foo = new int[n*n]
但是,当涉及到堆或堆栈上的数据访问和计算时,有任何显着的差异?即
有速度差异吗?foo[i]
代码应该在几种不同的体系结构上运行,因此尝试和测量将不起作用。
答案 0 :(得分:4)
可能存在(高度系统依赖性)有关缓存局部性和读/写未命中的问题。如果您在堆栈和堆数据上运行程序,那么可以想象(根据您的缓存架构)您遇到更多缓存未命中,而不是完全在一个连续区域上运行它堆栈。以下是Andrew Appel(来自SML / NJ)和Zhong Shao的文章,他们正在研究这个问题,因为堆栈/堆分配是实现函数式语言的主题:
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.3778
他们发现了一些写入未命中的性能问题,但估计这些问题可以通过缓存的进展来解决。
因此,我对现代桌面/服务器机器的猜测是,除非您运行经过大量优化的特定于体系结构的代码,这些代码沿着缓存行传输数据,否则您将不会注意到堆栈访问和堆访问之间的任何差异。对于具有小缓存的设备(如ARM / MIPS控制器),情况可能会有所不同,无论如何忽略缓存都会产生明显的性能影响。
答案 1 :(得分:1)
堆栈将更频繁地位于 CPU缓存中,因此在某些(大多数?)情况下可能更快。
但最准确的答案可能是:它取决于......
答案 2 :(得分:1)
作为单一陈述,无所谓。
没有更多的背景,可以说很少。有一些有利于堆栈的效果几乎在所有时间都可以忽略不计。
堆栈可能已经在缓存中,新分配的堆块可能不是。但是,这只是第一次执行惩罚。对于大量数据,无论如何都要颠倒缓存
堆栈分配本身比堆分配便宜一点,因为分配更简单
长期来看,堆的主要问题通常是碎片化,“累积成本”(通常)不能归因于单一分配,但可能会显着增加进一步分配的成本
测量这些效果至少是棘手的。
推荐:性能不是此处的决策者。可移植性和可伸缩性建议将堆用于所有但非常少量的数据。
答案 3 :(得分:-1)
除非分配,访问数据(无论是堆栈还是基于堆栈)之间应该没有明显的区别 - 它在一天结束时都是内存。