【发布时间】:2019-09-22 00:56:04
【问题描述】:
由于优化原因,我希望我的向量存在于缓存中,并且将它放在堆栈上会大大增加这种可能性。是否可以在堆栈上创建向量?如果有必要,我完全愿意重新实现我自己的std::vector 变体以使其成功。如有必要,我也很乐意使用内联汇编。
【问题讨论】:
-
如果它在堆栈上,那么它如何调整大小?它需要一个在编译时已知的固定大小。也许您正在寻找
std::array。 -
关于“将[向量]放在堆栈上会大大增加[其内容在缓存中]的几率。” 这是推测。缓存可以从堆栈和堆中加载数据。事实上,从软件的角度来看,内存的位置(自动存储与免费存储)与它的物理位置(缓存、RAM、磁盘等)之间甚至没有很强的相关性。
-
CPU缓存不关心栈上是否有东西。
-
只使用一个向量。它将被加载到缓存中。这就是为什么它是您应该首先考虑使用的容器。在很多情况下,它会比其他具有更好算法保证的容器更快,因为它们都会遇到缓存未命中的问题,而遍历向量则不会。
-
你测量过 malloc/new 的开销有多大吗?在大多数情况下,开销不是真正的问题,但缓存友好性才是。因此,您必须以这样一种方式编写您的算法,即操作数可以正确地放入缓存行或至少放入 L1/L2 缓存中。
标签: c++ performance caching optimization