5

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

4

2 回答 2

4

撇开缓存问题不谈,CPU 堆栈就是一个堆栈,一个 LIFO 列表/队列。您以与放置它们的顺序完全相反的顺序从中删除东西。您不会通过移除中间的东西来在其中创建孔。这使得它的管理极其简单:

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

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

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

并同样释放它:

stackpointer += size; // free

您的堆 OTOH 没有 LIFO 属性。因此,它必须单独跟踪所有分配的块。这意味着,它必须有某种空闲块列表和已分配块列表,并且它需要在分配时寻找足够大的块,并在释放时寻找指定的块,然后可能会在过程。简单堆栈不需要做任何这些。

仅这一点就是两种分配和解除分配方式之间的显着算法差异。

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

于 2013-04-06T23:32:34.700 回答
3

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

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

于 2013-04-06T23:26:11.230 回答