malloc 从操作系统请求内存,按照页面大小的倍数分配内存(显然,由于页面大小定义了分配内存的量子),并将其分发给您以较小的块。 这与所有内存分配器所做的没有区别--实际上,专用的内存分配器(例如Boost.Pool)在幕后使用malloc时会再次执行此操作:它们通过malloc分配更大的内存块,并将其分发给您以较小的部分。
我正在处理的应用程序内部使用Doug Lea的malloc.c实现(ftp://g.oswego.edu/pub/misc/malloc.c),该实现在许多平台上被广泛使用。这个实现从系统中获取内存,在Windows中以64KB块为单位保留和分配内存,使用VirtualAlloc。然后它使用各种算法和数据结构尽可能高效地使用这些内存。我测试了2字节的分配,从调试器中可以看到它首先将其填充为4字节,并将其放入SmallBins中 - 这是一种处理小内存分配的方法。最终,我看到这个分配的实际内存使用量为16字节。但这可能与平台相关。
malloc()
等的方法。 从根本上讲,malloc()
会在某个地方保留有关其已分配并提供给程序员的块大小的信息;通常,这就是您由malloc()
给出的指针之前的位置。malloc()
始终将分配舍入到方便大小(供其使用);对于32位系统,通常为8字节的倍数,而对于64位系统,则为16字节的倍数。 - Jonathan LefflerVirtualAlloc
的方法,你会如何编写malloc
和free
呢?(现在只尝试编写malloc
和free
,不用担心realloc
等等。) - Eric Lippert