C++堆栈内存和CPU缓存

tow*_*120 5 c++ caching stack-memory

我听说放在C++堆栈中的数据很可能出现在CPU缓存中.
http://www.gamedev.net/topic/564817-stack-and-cache-question-optimizing-sw-in-c/#entry4617168

"堆栈是存储数据的最有效位置,因为相同范围的内存地址会一次又一次地重复使用."

由于隐含的操作顺序,堆栈上最常访问的数据几乎肯定总是在L1缓存中.

这是真的?


我的意思是,尝试将经常访问的数据存储在堆栈中比在堆中更好吗?

Mat*_* M. 9

C++ 标准的确切实现是一个实现细节:它因编译器而异,因平台而异,等等......

现在,即使理论上您可以为 C++ 使用拆分堆栈,但主要实现使用连续的内存段(不同大小)。

这种连续性和频繁重用确实很容易获得缓存的好处,但它也不是灵丹妙药。实际上,您还可以为缓存反弹创建人工场景:如果您的 L1 缓存很小(32k ?)并且具有 2 路关联性,那么您可以轻松制作需要访问 L2 缓存的场景。只需在堆栈上使用 64k 数组(它足够小,不会炸毁它),然后在循环中重复访问 0、16k、32k 和 48k 的数据:它应该触发大量驱逐并需要从 L2 缓存中获取。

因此,堆栈本身并不是真的对缓存如此友好,而是它的使用是可预测的和众所周知的。您可以使用定制的分配器获得相同的缓存优势(尽管分配会稍微慢一些)。

另一方面,使用堆栈还有其他优点和缺点:

  • 缺点:如果你试图消耗太多,你会得到一个堆栈溢出。
  • 缺点:如果覆盖堆栈上的数组,可能会破坏堆栈本身,这是调试噩梦(所谓的堆栈粉碎攻击也使用它)。
  • 优点:C++ 具有利用堆栈行为的特定模式(RAII、SBRM)。确定性的“撤消”操作是一种编程乐趣。

所以最后我会谨慎地根据潜在的缓存行为在堆栈和堆之间做出决定。