【问题标题】:C++ Memory Management and Virtual memory Page sizeC++ 内存管理和虚拟内存页面大小
【发布时间】:2014-07-14 09:37:10
【问题描述】:

谁能解释一下 C++ new 和虚拟内存页面大小之间的关系。操作系统将物理内存划分为页面(通常为 4K),并将其映射到虚拟内存中。我想了解 C++ new/delete 是如何影响页面分配的。

谢谢 纳耶姆

【问题讨论】:

  • 当你开始使用它时,operator new 使用操作系统 API 来请求内存。这只是提出请求的另一种方式。通过内置运算符的事实并不意味着正在发生其他事情。
  • C++/C 库必须以一种或另一种方式向操作系统请求内存。根据方法,它可能会以 4k 粒度接收内存(但当然会从该页面提供后续的 malloc() 直到它被耗尽)。有关概述,请参阅 en.wikipedia.org/wiki/…。
  • 感谢您的回复,现在如果我想优化我的程序,在我的 malloc/new 向操作系统释放内存之前,我不会看到任何变化。对于我们的产品,我们做了很多优化,但与旧版本相比,我们可以看到使用的 RAM 量有任何差异。我很难说服我的经理允许我将开发资源用于优化。是否有任何指南/工具有助于减少进程的内存占用?

标签: c++ memory-management operating-system


【解决方案1】:

冒着过于简单化的风险:

页面大小和新页面之间没有真正的关系。大多数 C++ 实现调用 malloc() 来在 new 中进行实际内存分配。

大多数 malloc 实现都管理一个堆内存池。当对 malloc 的调用发出当前内存池无法满足的请求时,malloc 会调用操作系统服务来扩大内存池。

此步骤通常通过请求操作系统将其他页面映射到进程虚拟地址空间来执行。

因此,malloc 池大小将是页面大小的增量。但是,malloc/new 通常会忽略页面边界。

删除/释放往往只是将内存返回到 malloc 池。已删除的内存页面不会作为页面释放。

一个新的/malloc 实现可能以许多不同的方式分配内存。有些以固定大小分配内存(通常会超出)。其他人根据请求的大小分配内存。

【讨论】:

  • 感谢您的回复,现在如果我想优化我的程序,在我的 malloc/new 向操作系统释放内存之前,我不会看到任何变化。对于我们的产品,我们做了很多优化,但与旧版本相比,我们可以看到使用的 RAM 量有任何差异。我很难说服我的经理允许我将开发资源用于优化。是否有任何指南/工具有助于减少进程的内存占用?
猜你喜欢
  • 2018-07-27
  • 2016-09-26
  • 2023-03-15
  • 2013-01-13
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多