【发布时间】:2017-11-25 14:51:55
【问题描述】:
我在这件事上听到了相互矛盾的意见。
有人说访问堆上分配的数据(即std::vector或通过malloc分配的动态数组)总是比访问堆栈上分配的数据慢一点,因为进程必须总是通过一个中间指针才能访问该数据可能位于完全不同的内存区域;另一方面,他们维护,访问分配在堆栈上的数据不需要通过这个中间指针,而且这些数据很可能已经被缓存了。
其他人声称只有在堆上的数据分配比在堆栈上慢(因为 malloc、mmap 和类似函数的开销),但访问不是,除了堆栈时的极少数情况并且堆位于不同的物理驱动器上。
真相是什么?
【问题讨论】:
-
没有真相。这取决于您的整个系统 - 代码和硬件。 NUMA machines 上的情况更加复杂。如果您确实需要了解,请分析您的应用程序并对其进行测试。
-
Err,堆栈和堆都没有与物理驱动器关联。
-
当内存访问转到“交换”(通常在物理驱动器上)时,您的代码不再“快速”,既不是堆栈也不是堆。
-
“我在这件事上听到了相互矛盾的意见。” - 关于所有你可以期待的。这两者怎么可能是真理?
-
参考位置是现代处理器的一切,L1 缓存中的数据访问速度很快,其他一切都很匆忙。堆栈总是占据优势,因为由于堆栈指针,它总是很热,编译器自然地对可能的访问进行分组,而且因为它很小,所以很难把你的腿打断。但它很小,照顾性能问题的程序员从不这样做,因为他们正在处理小任务。所以它作为“总是这样做this”的指导并没有多大用处。这是一句老生常谈,只不过是“过马路前左右看看”。
标签: c++ performance memory