[英]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缓存中进行提取。
因此,堆栈本身并不是那么容易缓存,而是使用可预测的且众所周知的。 您可以使用定制的分配器获得相同的缓存好处(尽管分配会稍微慢一些)。
另一方面,使用堆栈还有其他优点和缺点:
因此,最后我会警惕仅根据潜在的缓存行为在堆栈和堆之间做出决定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.