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

What decides where on the heap memory is allocated?

让我澄清一下:我了解新建和删除(以及删除[])的工作原理。明白什么是栈,明白什么时候在栈上和堆上分配内存

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

什么在选择堆内存的存储位置?它是如何选择的?

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

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

堆确实在进程之间共享,但在 C++ 中,delete 关键字不会 return 操作系统的内存,而是保留它以供以后重用。分配内存的位置取决于您要访问多少内存,必须有足够的 space 以及 OS 如何处理内存分配,它可以是先到先得,最好的和最差的(在 google 上阅读有关该主题的更多信息)。 RAM 这个名字基本上告诉你在哪里搜索你的记忆 :D 但是,当您有一个小程序并多次重新启动它时,可以获得相同的内存位置。

内存由 OS 管理。所以答案取决于使用的 OS/Plattform 。 C++ 规范没有指定较低级别的内存如何allocated/freed,而是在生命周期中指定它。

而多用户 desktop/server/phone OS(如 Windows、Linux、macOS、Android、...)具有类似管理内存的方式,在嵌入式系统上可能完全不同。

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

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

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

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

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

I want to learn more about memory fragmentation

分片有两种方式。一个由内存地址 expos 由 OS 提供给 C++ 运行时。 hardware/OS 一侧(嵌入式系统可能相同)。无法使用 stdlib 提供的函数确定 OS 组织内存的方式和形式。以及进程的地址 spaces 的碎片如何表现,再次取决于 os 和使用的标准库。

None这些细节在C++规范标准中都有规定。只要最终结果符合标准,每个 C++ 实现都可以自由地以任何适合它的方式实现这些细节。

每个 C++ 编译器和操作系统都以其独特的方式实现这些底层细节。对于这些适用于每个 C++ 编译器和每个操作系统的问题,没有特定的答案。随着时间的推移,很多研究都针对典型 C++ 应用程序的内存分配和释放算法进行了分析和优化,并且有一些定制的 C++ 实现提供了每个应用程序都会选择的替代内存分配算法,它认为最适合它。当然,其中 none 是 C++ 标准涵盖的。

当然,您计算机中的所有内存都必须在 运行 上的所有进程之间共享,并且您的操作系统负责将其分配并分配给所有进程,当它们请求更多内存。所有“将内存返回到OS”的意思是进程的内存分配器已经确定它不再需要足够大的连续内存范围,之前使用过但不再使用,并通知操作系统它不再使用它,它可以重新分配给另一个进程。

What decides where on the heap memory is allocated?

从C++程序员的角度来看:由(C++语言的)实现决定。

从 C++ 标准库实现者的角度(作为某些实现可能假设为真的示例):它由 malloc 决定,它是 C 标准库的一部分。

malloc 实现者的角度来看(作为某些实现可能假设为真的示例):堆的位置通常由操作系统决定(例如,在 Linux 系统它可能是 sbrk 返回的任何地址)。任何单独分配的位置都由实施者决定,只要它们保持在操作系统和语言规范规定的限制范围内。


请注意,堆内存在 C++ 中称为“自由存储”。我认为这是为了避免与不相关的堆数据结构混淆。


I understand what the stack is

请注意,C++ 语言中没有“栈内存”这样的东西。 C++ 实现以这种方式存储自动变量的事实是一个实现细节。