首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态内存使用速度慢的原因是什么?

动态内存使用速度慢的原因是什么?
EN

Stack Overflow用户
提问于 2013-04-07 07:15:39
回答 2查看 2.5K关注 0票数 5

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-07 07:32:35

抛开缓存问题不谈,CPU堆栈就是一个堆栈,一个后进先出列表/队列。你从其中移除东西的顺序与你放在那里的东西的顺序完全相反。不要通过移除中间的东西来在其上创建孔。这使得它的管理变得非常琐碎:

代码语言:javascript
运行
复制
memory[--stackpointer] = value; // push
value = memory[stackpointer++]; // pop

或者你可以分配一大块:

代码语言:javascript
运行
复制
stackpointer -= size; // allocate
memset(&memory[stackpointer], 0, size); // use

同样地释放它:

代码语言:javascript
运行
复制
stackpointer += size; // free

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

这本身就是分配和释放两种方式之间的显着算法差异。

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

票数 4
EN

Stack Overflow用户

发布于 2013-04-07 07:26:11

“更好”可能不是一个很好的描述方式,但在堆栈上分配内存通常比在堆上分配内存“更快”。你说得对,是内存的分配更慢,而不是后来对内存的使用。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15857099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档