动态内存使用速度较慢是啥? [复制]

Posted

技术标签:

【中文标题】动态内存使用速度较慢是啥? [复制]【英文标题】:What is slower about dynamic memory usage? [duplicate]动态内存使用速度较慢是什么? [复制] 【发布时间】:2013-03-29 05:40:13 【问题描述】:

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

【问题讨论】:

这个问题已经回答***.com/questions/161053/… 通用分配器速度较慢。还有specialized allocators(比那篇文章中讨论的要多得多,但这是一本非常好的入门书)。如果您真正了解代码的内存要求,它们可以满足您的大部分需求,同时显着提高效率:速度更快、对碎片更有弹性,并且更节省空间。有些本质上等同于内置堆栈,因此同样有效。 【参考方案1】:

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

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

【讨论】:

编辑,因为我的意思是“更快”,而不是“更好”【参考方案2】:

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

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

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

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

同样释放它:

stackpointer += size; // free

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

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

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

【讨论】:

您能否详细说明您对“虚拟地址空间”的看法? Virtual address space.

以上是关于动态内存使用速度较慢是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我的电脑反应慢 是啥原因?

网页加载很慢是啥原因

下载速度很慢是啥原因?

Java堆与栈

内存初始化

java的内存管理机制