如何使用malloc分配小于4KB的内存?

4
如果malloc调用VirtualAlloc()函数来分配内存(它最少会分配4KB),那么malloc如何为int类型分配4个字节的内存?

修复它... int通常有4个字节而不是2个,但问题很好。 - Wagner Patriota
你是不是指它调用HeapAlloc()函数? - Alex K.
2
这可能很有趣:http://en.wikipedia.org/wiki/C_dynamic_memory_allocation#Implementations - Bart Friederichs
1
如果您有K&R可用,那么它展示了一种实现malloc()等的方法。 从根本上讲,malloc()会在某个地方保留有关其已分配并提供给程序员的块大小的信息;通常,这就是您由malloc()给出的指针之前的位置。 malloc()始终将分配舍入到方便大小(供其使用);对于32位系统,通常为8字节的倍数,而对于64位系统,则为16字节的倍数。 - Jonathan Leffler
学习 malloc 的好方法是编写自己的实现。假设有一个名为 VirtualAlloc 的方法,你会如何编写 mallocfree 呢?(现在只尝试编写 mallocfree,不用担心 realloc 等等。) - Eric Lippert
显示剩余3条评论
2个回答

8
malloc 从操作系统请求内存,按照页面大小的倍数分配内存(显然,由于页面大小定义了分配内存的量子),并将其分发给您以较小的块。

这与所有内存分配器所做的没有区别--实际上,专用的内存分配器(例如Boost.Pool)在幕后使用malloc时会再次执行此操作:它们通过malloc分配更大的内存块,并将其分发给您以较小的部分。


+1 不少人也称之为子分配器。许多(我敢说大多数)运行时库会为您执行类似的操作(或者至少在内存“宝贵”时期是这样的)。 - WhozCraig

1
我正在处理的应用程序内部使用Doug Lea的malloc.c实现(ftp://g.oswego.edu/pub/misc/malloc.c),该实现在许多平台上被广泛使用。
这个实现从系统中获取内存,在Windows中以64KB块为单位保留和分配内存,使用VirtualAlloc。然后它使用各种算法和数据结构尽可能高效地使用这些内存。
我测试了2字节的分配,从调试器中可以看到它首先将其填充为4字节,并将其放入SmallBins中 - 这是一种处理小内存分配的方法。最终,我看到这个分配的实际内存使用量为16字节。但这可能与平台相关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接