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

2024-04-07

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

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

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

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

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

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

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

所以堆并不便宜。


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

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

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

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

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

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 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更复杂 在我看来 当