new / malloc 在内存充足但碎片化的环境下会不会造成内存洗牌?

Does new / malloc cause memory shuffling in the environment of sufficient but fragmented memory?

这只是出于好奇。

例如,假设我们已经用完了 8 个字节中的 2 个:

[xx------]

如果我调用 new / malloc 请求 3 个字节,它应该可以正常工作,也许像这样:

[xx--xxx-]

如果我调用 new / malloc 请求另外 3 个字节,会发生什么?就可用内存而言,仍然有 3 个空闲字节,即使它们不是连续的。程序会不会再"defragment"内存来为新分配space?听起来不可能,因为我仍然会坚持对现有分配的引用。

如果是这样,那么通过扩展到一个极端的情况,如果你的内存不知何故最终变得非常碎片化(例如每隔一个字节是已分配 ala [x-x-x-x- x-x-x-x-]),这是否意味着尽管有 50% 的可用内存,我什至无法分配 2 个字节?

我认为平台不重要?

对于扩展问题,我们深表歉意,但这是否也会发生在其他语言中,例如 Java/C#?

没错,内存会变得如此碎片化,以至于无法再进行分配。一个好的分配器会尽可能合并释放的块,以限制碎片。

MS .NET 托管框架通过间接分配内存块解决了这个问题,即通过指向块的指针的指针。这样,一个块可以被移动到碎片整理内存,而不用改变指针的指针。 (框架采取了一些措施来避免并发问题,因为 .NET 有一个异步垃圾收集器 运行。)