我知道在堆栈上分配内存比在堆上分配内存快,但是为什么堆内存分配慢呢?是不是因为堆栈分配是连续的,因此问题的出现是因为缓存的局部性?不是内存分配后的使用情况,而是分配时间比较慢吗?
发布于 2013-04-07 07:32:35
抛开缓存问题不谈,CPU堆栈就是一个堆栈,一个后进先出列表/队列。你从其中移除东西的顺序与你放在那里的东西的顺序完全相反。不要通过移除中间的东西来在其上创建孔。这使得它的管理变得非常琐碎:
memory[--stackpointer] = value; // push
value = memory[stackpointer++]; // pop或者你可以分配一大块:
stackpointer -= size; // allocate
memset(&memory[stackpointer], 0, size); // use同样地释放它:
stackpointer += size; // free您的堆OTOH没有LIFO属性。因此,它必须单独跟踪所有已分配的块。这意味着,它必须有某种类型的空闲块列表和已分配块的列表,并且它需要在分配时查找足够大的块,并在释放时查找指定的块,然后可能在此过程中进行一些块拆分和合并。简单堆栈不需要执行任何这些操作。
这本身就是分配和释放两种方式之间的显着算法差异。
缓存和将物理内存映射到虚拟地址空间的显式调用也加在一起,但是如果您认为它们在这两种情况下是相等的,那么仍然会有几条指令与几十到几百条指令的差异。
发布于 2013-04-07 07:26:11
“更好”可能不是一个很好的描述方式,但在堆栈上分配内存通常比在堆上分配内存“更快”。你说得对,是内存的分配更慢,而不是后来对内存的使用。
堆分配变慢的原因是堆管理器需要做额外的工作:它们通常试图找到与您请求的大小非常接近的现有内存块,并且在释放块时,它们通常会检查相邻的内存区,看看它们是否可以合并。堆栈分配只是将一个值添加到一个指针上,仅此而已。
https://stackoverflow.com/questions/15857099
复制相似问题