什么决定堆内存分配的位置?

INE*_*ERS 1 c++ memory memory-management heap-memory memory-fragmentation

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

然而,我不明白的是:在堆上分配内存的位置。我知道我们应该把堆看作是一个几乎无限的 RAM 大池,但肯定不是这种情况。

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

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

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

t.n*_*ese 5

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

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

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

它的操作系统负责。究竟如何取决于 - 正如已经说过的 - 取决于操作系统。操作系统也可以是运行时库和像includeos这样的最小操作系统的组合形式的薄层

这是否意味着堆在所有进程之间共享?

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

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

我想了解更多关于内存碎片的信息

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