C++ new / new[],它是如何分配内存的?

2024-01-25

我现在想知道这些指令如何分配内存。

例如,如果我得到代码怎么办:

x = new int[5]; 
y = new int[5];

如果这些都被分配了,那么它在 RAM 中的实际情况是什么样的? 是否为每个变量保留整个块,或者块(内存页或如何称呼它 - 32 位上的 4KB 大小)为 2 个变量共享?

我在任何手册中都找不到我的问题的答案。感谢您的所有回复。

我在维基百科上找到: 页面内部碎片 进程很少需要使用精确数量的页面。因此,最后一页可能只是部分满,浪费了一些内存。较大的页面大小显然会增加这种方式浪费内存的可能性,因为更多可能未使用的内存部分会加载到主内存中。较小的页面大小可确保更接近分配中所需的实际内存量。 例如,假设页面大小为 1024KB。如果一个进程分配 1025KB,则必须使用两个页面,从而导致 1023KB 的未使用空间(其中一个页面完全消耗 1024KB,而另一页面仅消耗 1KB)。

这就是我问题的答案。不管怎样谢谢大家。


典型的分配器实现将首先调用操作系统来获取巨大的内存块,然后为了满足您的请求,它会给您一块内存,这称为二次分配。如果内存不足,它将从操作系统获取更多内存。

分配器必须跟踪它从操作系统获得的所有大块以及它分发给客户端的所有小块。它还必须接受客户端返回的块。

典型的子分配算法保留每个大小的返回块的列表,称为freelist并且总是尝试满足来自空闲列表的请求,仅当空闲列表为空时才转到主块。这种特殊的实现技术对于普通程序来说非常快速且非常有效,但如果请求大小到处都是(这对于大多数程序来说并不常见),它会产生糟糕的碎片属性。

像 GNU 的 malloc 实现这样的现代分配器很复杂,但已经建立了数十年的经验,并且应该被认为非常好,以至于很少需要编写自己的专用子分配器。

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

C++ new / new[],它是如何分配内存的? 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 如何在 Bash 中编写奇特的缩进多行大括号扩展?

    我正在处理这样的一行 mkdir p DEST ROOT PATH DEST DIR1 DEST DIR2 DEST DIRN 这条线相当长 我想对其进行切割 使其宽度适合 80 列的线 我试图用反斜杠转义行尾 但空格对齐破坏了扩展 ech
  • 如何从 Codepen 获取代码并在本地使用?

    如何从 codepen 获取代码 并在本地文本编辑器中使用它 http codepen io mfields pen BhILt http codepen io mfields pen BhILt 我试图在本地玩这个创作 但是当我在 Chr
  • SFML 未静态链接到 openal32(静态链接到所有其他依赖项)

    我使用 CMake for MinGW 编译了 SFML 运行 mingw32 make install 后 一切都已构建并安装 没有错误 但运行示例时 pong exe sound exe sound capture exe 和 voip
  • 检测距离集合视图中心最近的集合视图单元

    怀疑我在下面做了一些根本错误的事情 我有一个水平集合视图 拖动后我想将最近的单元格捕捉到中心 但我的结果是不可预测的 我在这里做错了什么 func scrollViewDidEndDragging scrollView UIScrollVi
  • 在 React 中将函数作为 useEffect 的依赖项传递的用例

    我开始学习 React 并发现了代码片段 其中函数作为 useEffect 中的依赖数组传递 我想知道此类函数作为依赖项传递的用例以及为什么我们需要将该函数作为依赖项传递 第一 这仅在以下情况下才有意义 useEffect回调使用该函数 所
  • 如何在输入时设置输入框文本的格式

    在 html 输入框中输入数字时如何格式化该数字 例如 我想输入数字 2000 当我输入第四位数字时 文本 当前显示在文本框中 将自动格式化为 2 000 带逗号 my modified code based on Moob answer
  • Spacy 中有二字母组和三字母组功能吗?

    下面的代码将句子分成单独的标记 输出如下 cloud computing is benefiting major manufacturing companies import en core web sm nlp en core web s
  • Android 增长堆 - 我应该担心吗?

    我读过一些关于应用程序在前端时 保留 16MB 内存的内容 至少 作为一名开发人员 我应该依靠这一点 尽管根据设备的不同 它可能会更多 我支持低至 2 2 froyo 所以很多设备都不会是高端设备 我在 Logcat 中收到一些消息说 03
  • 将数据添加到 socket.io 对象

    我有一个与上一个问题类似的问题 将数据添加到 socket io 套接字对象 https stackoverflow com questions 17351881 adding data to a socket io socket obje
  • Pandas:如何检测数据框中的峰值点(异常值)?

    我有一个带有多个速度值的 pandas 数据框 这些速度值是连续移动的值 但它是传感器数据 因此我们经常在中间的某些点上出现错误 移动平均值似乎也没有帮助 所以我可以使用什么方法用于从数据中删除这些异常值或峰值点 Example data
  • Notepad++ 搜索并替换多个文本行

    我在许多不同的规则中有数千个这样的规则 edit 1698 set src address 172 29 44 51 32 set dst address 172 29 44 67 32 set service tcp 1022 set s
  • 使用JSF作为Spring MVC的视图技术

    我目前正在实现一个小型 Spring MVC PoC 我想使用 JSF 作为视图技术 因为我公司的大多数人都习惯于带有 Primefaces 环境的 J2EE Spring MVC 3 支持 JSF 还是仅仅支持 JSP 我读过多篇混合这两
  • Visual Studio > Google Chrome:打开新窗口而不是新选项卡

    我使用 Chrome 作为 Visual Studio 2010 中的默认浏览器 每当我调试 Web 应用程序时 如果有任何现有的 Chrome 实例打开 那么 VS 会自动在该实例上创建一个新选项卡 有谁知道是否可以强制 VS 打开全新的
  • 取消合并电子表格单元格并用数据填充先前合并的空单元格

    中断 https developers google com apps script reference spreadsheet range breakapart工作正常 但我想用合并单元格的数据填充空单元格 var sheet Sprea
  • 字符串数组的排列

    我根本不知道如何解决这个问题 在谷歌上彻底搜索后没有结果 我向你求助 希望能找到解决方案 给出下面的示例数组 array Type gt array Toppe Bukser og Jeans Size gt array Extra sma
  • 如何将智能指针传递给需要原始指针的函数?

    我有以下代码 unsigned char frame buffer data new unsigned char data size glReadPixels origin x origin y width height GL BGR GL
  • PyQt + 触发按钮的快捷方式

    How do I configure keyboard shortcuts to click specific buttons in a PyQT app Eg Ctrl 1 to click one button while Ctrl 2
  • 执行 python 脚本会将其加载到内存中吗?

    我正在使用 python 脚本运行python3 myscript py在 Ubuntu 16 04 上 脚本是加载到内存中还是从硬盘中逐行读取并解释 如果不是一次全部加载 是否有任何方法可以知道或控制加载到内存中的块有多大 它被完整地加载
  • Spring MVC 3.0 中的 url-action 映射和路由

    我正在使用 Spring MVC 3 0 开发一个 Web 应用程序 并寻找一个现成的解决方案 如果有 或者一个 url action 映射和路由系统的 最佳实践 参考 可以实现以下目标 REST 友好的控制器 方法名称到视图映射 当前的映
  • C++ new / new[],它是如何分配内存的?

    我现在想知道这些指令如何分配内存 例如 如果我得到代码怎么办 x new int 5 y new int 5 如果这些都被分配了 那么它在 RAM 中的实际情况是什么样的 是否为每个变量保留整个块 或者块 内存页或如何称呼它 32 位上的