动态内存使用的速度有多慢?

时间:2013-04-06 23:15:39

标签: c++

我知道在堆栈上分配内存比在堆上分配内存更快,但为什么堆内存分配更慢?是因为堆栈分配是连续的,因此问题出现是因为缓存局部性?是不是分配后的内存使用情况,分配的时间是否较慢?

2 个答案:

答案 0 :(得分:3)

除了缓存问题,CPU堆栈只是一个堆栈,一个LIFO列表/队列。你从它放在那里的东西完全相反的顺序删除它。你不要通过删除它中间的东西来创建它。这使得它的管理非常简单:

memory[--stackpointer] = value; // push
value = memory[stackpointer++]; // pop

或者你可以分配一个大块:

stackpointer -= size; // allocate
memset(&memory[stackpointer], 0, size); // use

同样释放它:

stackpointer += size; // free

你的堆OTOH没有LIFO属性。因此,它必须单独跟踪所有已分配的块。这意味着,它必须有一些空闲块列表和一个已分配块列表,它需要在分配时寻找足够大的块,并在释放时查找指定的块,然后可能在块中进行一些块拆分和合并。处理。简单的堆栈不需要执行任何操作。

仅此一项就是两种分配和解除分配方式之间的重要算法差异。

将物理内存映射到虚拟地址空间的缓存和显式调用也加起来,但是如果你认为它们在两种情况下都是相同的,那么你仍然会有一些指令与几十到几百条指令不同

答案 1 :(得分:2)

“Better”可能不是描述它的好方法,但在堆栈上分配内存通常是“更快”,而不是在堆上。你是正确的,它是内存的分配较慢,而不是之后使用该内存。

堆分配往往较慢的原因是堆管理器需要做额外的工作:它们经常尝试找到一个与您请求的大小非常接近的现有内存块,并且在释放块时,它们通常会检查相邻的内存区域,看看它们是否可以合并。堆栈分配只是向指针添加一个值,仅此而已。