【发布时间】:2014-05-20 13:07:25
【问题描述】:
我听说放置在 C++ 堆栈中的数据最有可能出现在 CPU 缓存中。
http://www.gamedev.net/topic/564817-stack-and-cache-question-optimizing-sw-in-c/#entry4617168
“堆栈是存储数据最有效的地方,因为同样的 内存地址范围被一次又一次地重用。”
由于隐含的操作顺序,最常访问的数据在 堆栈几乎肯定总是在 L1 缓存中。
这是真的吗?
我的意思是,尝试将频繁访问的数据存储在堆栈中真的比堆中更好吗?
【问题讨论】:
-
我认为,如果您想要一个比“这取决于您的数据大小和缓存大小”更好的答案,那么您将不得不更加具体。
-
IMO 这是一个太大的简化。现在有更多的变量需要考虑。为什么频繁访问的堆分配内存块被缓存的机会更少?顺便说一句,L1 缓存非常小,您使用几 KB 的数据吗?
-
@Adriano 嗯,我认为那些,来自 100-500 Kb 的堆栈。好吧,不是在 L1 中,但至少在某个地方(在缓存中)? :)
-
但是堆栈并不是那么邪恶,即使它并不总是/全部缓存。这取决于您的数据(大小和性质)和您的代码(算法和路径)。如果您的“瓶颈”是一个大型矩阵乘法例程,那么跳转将是您的敌人(如果您的所有单线程应用程序堆栈都保存在缓存中,您将不会注意到任何好处)。总结一下:不,IMO 断言太天真并且过于简单化了一切(所以你可能会在错误的事情上浪费时间)。
-
一个不错的经验法则。在堆栈上分配的对象比使用 new() 分配的相同对象更有可能在 L1 缓存中。但这都是次要的。盲目地遵守这条规则会给你带来麻烦。根据具体情况,还有其他更重要的原因将事物放入堆栈或不将它们放入堆栈。
标签: c++ caching stack-memory