为什么堆上的内存分配比堆栈上的内存分配慢得多?

2024-04-07

我已经被告知很多次了。但我不知道为什么......从堆分配内存时会涉及哪些额外成本?与硬件有关吗?与CPU周期有关吗?这么多的猜测,但没有确切的答案......有人能给我一些详细说明吗?

正如“unwind”所说,Heap数据结构比Stack更复杂。在我看来,当线程开始运行时,一些内存空间会被分配给线程作为其堆栈,而堆则由进程内的所有线程共享。这种范例需要一些额外的机制来管理每个线程对共享堆的使用,例如垃圾收集。我的说法正确吗?

添加 1 - 2022 年 5 月 13 日上午 10:42

堆栈的管理只涉及指令和寄存器(SP、BP),从某种意义上来说,这自然/纯粹是硬件。

而对于堆来说,还涉及到复杂的软件数据结构和算法,其中涉及到函数调用(又涉及到栈)、内存访问等。

硬件速度快,但不如软件灵活。

软件灵活,但不如硬件快。

所以堆并不便宜。


因为堆是一种比栈复杂得多的数据结构。

对于许多体系结构,在堆栈上分配内存只是更改堆栈指针的问题,即它是一条指令。在堆上分配内存涉及寻找足够大的块,将其分割,并管理“簿记”,以允许诸如free()以不同的顺序。

当作用域(通常是函数)退出时,保证在堆栈上分配的内存被释放,并且不可能只释放其中的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么堆上的内存分配比堆栈上的内存分配慢得多? 的相关文章

随机推荐

  • QVD 文件到 pandas DataFrame

    我尝试使用此将 QVD 文件加载到 pandas 数据框tool https github com korolmi qvdfile如下面的脚本所示 问题是它工作完美 但没有优化 而且它只提供了一种通过索引获取行的方法 这就是我被迫使用 fo
  • 从车把助手返回 html 对象

    我需要从车把助手发送一个 html 对象 如下所示 Handlebars registerHelper helper function Create an input object var inp
  • 在 WinForms 应用程序中渲染 HTML 的最佳方法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个 WinForms 应用程序 在 net 3 5 上运行 该应用程序动态生成 HTML 其中包括完整的文档以及内联 CSS 样式表 在
  • 在特定时间段内使用 JavaScript 更改 HTML 元素的背景颜色?

    我有大约 26 个 html 元素 我希望它们在 JavaScript 中具有以下效果 有可能做这样的事情吗 我试图这样做 var j 2000 for i 1 i lt 26 i setInterval function document
  • Arquillian 测试在 JBoss eap 6.1 上失败(但在 JBoss 7.1.1 上工作)

    我在 JBoss eap 6 1 服务器上运行 arquillian 测试 由 jenkins 作业启动 时遇到问题 在 JBoss 7 1 1 服务器上运行测试没有问题 但是当我切换到 eap 6 1 时 所有测试都会出现以下异常 jav
  • 如何让一个特性既可以读又可以写?

    我知道一个特征只能有一个属性和一个权限 并且该属性必须与权限具有相同的值 例如如果特征具有写入权限 则它必须具有可写的属性 那么如何使特征可读且可写 e g 怎么转这个 int permission BluetoothGattCharact
  • 如何进行 TCP 打孔?

    问题如下 这是我当前的测试代码 但没有成功 static void Main string args if args Count 3 Console WriteLine Bad args var ep new IPEndPoint IPAd
  • Symfony2 会话闪存与树枝中的 if 子句不起作用

    我尝试对设置的会话闪存做出反应 但总是得到其他路径 交响乐2 1 3 控制器 this gt get session gt getFlashBag gt set contactActionNoticeError Message not se
  • 数据视图和数据表有什么区别?

    NET 中的 DataView 和 DataTable 有什么区别 据我了解 DataView只是DataTable的错误呈现 我什么时候应该使用 DataView 当您想要运行查询并在控件中显示数据子集时 DataView 可以帮助您 这
  • 无法连接 x 代码 (\x) - PHP

    我正在寻找使用 unpack 这有效 srbytes x80 x3e x00 x00 array1 unpack v srbytes 这不会 num1 80 srbytes x num1 x3e x00 x00 array1 unpack
  • 如何在不使用 input 元素的情况下捕获 Vuejs 中的任何按键事件

    我正在制作一种游戏 我希望用户输入特定的单词 然后我想检查是否按下了特定的单词 如果按下该单词 我将获取下一个单词 目前我正在使用表格并使用过v model如下图所示
  • 如何获取某个Realm对象在Results中的索引?

    这是一个例子 class Person Object dynamic var id dynamic var name does this work let sortedPeople realm objects Person sorted i
  • golang中没有这样的文件或目录错误

    我想在我的 golang 控制器之一中指定一个 html 模板 我的目录结构是这样的 Project com src controller contoller go view html first html 我想为请求 new 加载firs
  • 将 HAML 模板与 Backbone.js 结合使用的最佳策略

    我进入 Backbone js 来为我的项目构建 javascript 代码 我喜欢 HAML 在后端 rails 上进行模板化 所以我想将它用于 Backbone 视图模板化 我知道 Javascript 有几个 HAML 端口 例如ht
  • OpenEJB 本地客户端注入失败

    请注意 我正在镜像很接近 事实上 我的情况有点简单 因为我此时甚至没有使用持久性单元进行测试 我的测试项目提供了一个简单的MDB和一个会话bean MDB 和会话 bean 都正常加载 并且无需注入即可成功测试 以受限方式 建议注射 Loc
  • 如何在我的邮件服务器中创建(或注册)新的 pop3 电子邮件帐户

    我正在创建一个 Android 应用程序 该应用程序将具有 API 来创建新的 pop3 电子邮件帐户 我正在使用 roundcube 网络邮件客户端创建新的电子邮件帐户 手动 但我需要以编程方式创建新帐户 我在网上搜索过 但我没有收到任何
  • 手动创建的多个数据源的事务管理

    我正在开发一个应用程序 其中我必须根据从客户端传递的客户 ID 连接到不同的数据库 所有数据库的架构都是相同的 它是一种多租户应用程序 由于我不知道会有多少客户 因此我无法使用 xml 配置静态创建数据源 因此我必须手动创建数据源 我们使用
  • 如何将 noreturn 与函数指针一起使用?

    我正在用 C11 编写引导加载程序 当引导加载程序需要将控制权转移给固件时 它会读取预定义内存地址处的函数指针并调用它 代码如下所示 typedef void FirmwareBootFn void typedef struct uint3
  • 渴望加载不同的嵌套多态

    使用 Rails 3 2 我的模型是这样嵌套的 审核 gt 可审核 国家或商店 国家 gt CountryDay gt 商店 gt 照片 商店 gt 照片 我有以下内容 reviews user reviews includes user
  • 为什么堆上的内存分配比堆栈上的内存分配慢得多?

    我已经被告知很多次了 但我不知道为什么 从堆分配内存时会涉及哪些额外成本 与硬件有关吗 与CPU周期有关吗 这么多的猜测 但没有确切的答案 有人能给我一些详细说明吗 正如 unwind 所说 Heap数据结构比Stack更复杂 在我看来 当