繁体   English   中英

C ++堆栈内存和CPU缓存

[英]C++ stack memory and CPU cache

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

“堆栈是存储数据的最有效的地方,因为相同范围的内存地址被一次又一次地重用。”

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

这是真的?


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

C ++标准的确切实现是实现细节:它随编译器的不同而不同,因平台而异,等等。

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

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

因此,堆栈本身并不是那么容易缓存,而是使用可预测的且众所周知的。 您可以使用定制的分配器获得相同的缓存好处(尽管分配会稍微慢一些)。

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

  • 缺点:如果尝试消耗过多,则会出现堆栈溢出。
  • 缺点:如果覆盖堆栈上的数组,则可能会破坏堆栈本身,这是调试的噩梦(所谓的堆栈粉碎攻击也使用了它)。
  • 优点:C ++具有利用堆栈行为的特定模式(RAII,SBRM)。 确定性的“撤消”操作很容易编程。

因此,最后我会警惕仅根据潜在的缓存行为在堆栈和堆之间做出决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM