内存由操作系统管理。所以答案取决于所使用的操作系统/平台。C++ 规范没有指定如何分配/释放较低级别的内存,它在生命周期中指定它。
虽然多用户桌面/服务器/手机操作系统(如 Windows、Linux、macOS、Android 等)与内存管理方式相似,但在嵌入式系统上可能完全不同。
什么可以控制选择堆内存的存储位置以及它是如何选择的?
它是负责的操作系统。正如已经说过的那样,究竟如何取决于操作系统。操作系统也可以是运行时库和最小操作系统(如includeos )的组合形式的薄层
这是否意味着堆在所有进程之间共享?
取决于观点。地址空间 - 对于多用户系统 - 通常不在进程之间共享。操作系统确保一个进程不能访问另一个进程的内存,这是通过虚拟地址空间来保证的。但是操作系统可以在所有进程之间分配整个 RAM。
对于嵌入式系统,甚至可能出现这样的情况,即每个进程都有固定数量的预分配内存(进程之间不共享),并且无法分配新内存或空闲内存。然后由开发人员自己管理预分配的内存,方法是为 stdlib 的对象提供自定义分配器,并在分配的存储中构建。
我想了解更多关于内存碎片的信息
有两种分片方式。一个是由操作系统向 C++ 运行时公开的内存地址给出的。以及硬件/操作系统方面的一个(对于嵌入式系统可能是相同的)。使用 stdlib 提供的功能无法确定操作系统可能对内存进行碎片整理的方式和形式。进程地址空间的碎片如何表现,再次取决于操作系统和使用的stdlib。