c++ - 什么决定了堆内存的分配位置?

标签 c++ memory memory-management heap-memory memory-fragmentation

让我澄清一下:我了解 new 和 delete(以及 delete[])的工作原理。我了解堆栈是什么,并且了解何时在堆栈和堆上分配内存。

但是,我不明白的是:内存分配在堆上的什么位置。我知道我们应该将堆视为一个几乎无限大的 RAM 池,但事实并非如此。

什么在选择堆内存的存储位置以及如何选择?

另外:“将内存返回给操作系统”这个术语是我经常遇到的。这是否意味着堆在所有进程之间共享?

我关心这一切的原因是因为我想了解更多关于内存碎片的知识。我认为在学习如何处理内存碎片之前了解堆的工作原理是个好主意,因为我没有足够的内存分配经验,也没有足够的 C++ 经验直接深入研究。

最佳答案

内存由操作系统管理。所以答案取决于所使用的操作系统/平台。 C++ 规范没有指定较低级别的内存是如何分配/释放的,它在生命周期的 from 中指定。

虽然多用户桌面/服务器/手机操作系统(如 Windows、Linux、macOS、Android 等)与内存管理方式类似,但在嵌入式系统上可能完全不同。

What is in control of choosing where on the heap memory is stored and how does it choose that?

是操作系统负责的。正如已经说过的,具体如何取决于操作系统。操作系统也可以是运行时库和最小操作系统(如 includeos)组合形式的薄层。

Does this mean that the heap is shared between all processes?

取决于观点。地址空间 - 对于多用户系统 - 通常不在进程之间共享。操作系统确保一个进程不能访问另一个进程的内存,这是通过虚拟地址空间来保证的。但是操作系统可以在所有进程之间分配整个 RAM。

对于嵌入式系统,甚至可能是每个进程都有固定数量的预分配内存——进程之间不共享——并且无法分配新内存或空闲内存。然后由开发人员通过为 stdlib 的对象提供自定义分配器来自行管理预分配的内存,并在分配的存储中构建。

I want to learn more about memory fragmentation

分片有两种方式。一个由操作系统向 C++ 运行时公开的内存地址给出。和硬件/操作系统方面的一个(对于嵌入式系统可能是相同的)。无法使用 stdlib 提供的函数确定操作系统如何以及以何种形式对内存进行碎片化。以及进程地址空间碎片的行为方式,再次取决于操作系统和使用的标准库。

关于c++ - 什么决定了堆内存的分配位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62970201/

相关文章:

c++ - Visual C++ native 内存管理最佳实践

c++ - 当您声明一个 friend 然后在类中定义它时,这意味着什么?

c - 调用免费电话前是否需要重置保护

C++:编译器如何知道为每个堆栈帧分配多少内存?

iphone - iOS NSDictionary 复制内存泄漏

c++ - 创建存储数组属性的对象数组

c++ - ?另一个按钮的按钮功能

c - Strtok 使用动态内存

c - 越界访问数组有多危险?

iphone - Objective-C 中的内存管理