为什么使用malloc分配内存块不遵循first-fit?

为什么使用malloc分配内存块不遵循first-fit?,c,gcc,malloc,heap,C,Gcc,Malloc,Heap,下面的代码似乎没有遵循glibc的first fit算法。我不知道这种差异从何而来,只是猜测不同的ubuntu版本或glibc。我正在使用LinuxUbuntu19.04和Glibc2.29。glibc_2.29-0ubuntu2 我尝试编译此代码: 结果是: 第一个malloc512:0x55e9722a9260 第二个malloc256:0x55e9722a9470 第三个malloc500:0x55e9722a9580 正如我所知,第三个malloc ptr应该是0x55E9722A926

下面的代码似乎没有遵循glibc的first fit算法。我不知道这种差异从何而来,只是猜测不同的ubuntu版本或glibc。我正在使用LinuxUbuntu19.04和Glibc2.29。glibc_2.29-0ubuntu2

我尝试编译此代码:

结果是:

第一个malloc512:0x55e9722a9260

第二个malloc256:0x55e9722a9470

第三个malloc500:0x55e9722a9580

正如我所知,第三个malloc ptr应该是0x55E9722A9260..

malloc绝对不能保证它如何分配内存。如果您需要一个特定的算法,您应该编写自己的或找到一个并修改它。编写一个简单的malloc并不难。很难编写一个适用于小数据块、大数据块、长寿命数据块和短命数据块等的高性能数据块

glibc包含malloc和大多数其他标准C库函数,是一个极其复杂和不断发展的软件。您的问题和答案最终取决于glibc的四个可能不同版本:

作者使用的glibc的精确版本 编译和运行测试程序时实际使用的glibc的编译版本 glibc source的版本,这里的各种回答者正在咨询 在回答此问题时,任何人咨询的任何文档中都记录了glibc的版本 现在,是的,在一个理想的世界里,我们使用过的每一个软件的每一个版本都会有一个精确而明确的版本号,所有文档都是最新的,能够准确地描述软件版本的各个方面,甚至在文档发布前一周发生了变化


但在现实世界中,我提到的四个带项目符号的glibc版本之间可能存在不匹配,这种不匹配最终会影响您提出的问题,这种可能性很容易达到100%。

malloc并不是真的“绝对不保证”。C标准不作任何保证,但malloc的各种实现都可以自由地这样做,有些实现是为各种目的而设计的,可能会指定它们的行为。事实上,glibc malloc或其一部分至少声明“对于大于等于512字节的大请求,它是一个纯粹的最佳分配程序,通常通过FIFO决定,即最近使用最少。”glibc 2.29 glibc/malloc/malloc.c。感谢您的回答。我刚刚发现,未排序的bin仅在请求大小完全相同的分配时使用。但是仍然不知道为什么像500或256这样不同的大小不适用于这一点。代码中关于glibc malloc是first fit的断言似乎是不正确的。根据glibc/malloc/malloc.c中glibc 2.29的源代码,它对至少128 KiB的请求使用系统内存映射,最适合于至少512字节但低于128 KiB的请求,是最多64字节请求的缓存分配器,并且是64和512字节的混合体。我没有检查所有的源代码以查看是否存在其他实现。为什么要将代码基于特定的malloc实现?你不喜欢可移植代码吗?