我可以为您翻译关于Linux/glibc的内容。
在源代码中,它包含像这样的注释:
如果n
的字节数比p
已经持有的字节数少,那么新的未使用空间将被切除并尽可能地释放。
如果您查看glibc的代码,它包含了像这样的行:
remainder_size = newsize - nb;
if (remainder_size < MINSIZE) {
set_head_size(newp, newsize | (av != &main_arena ? NON_MAIN_ARENA : 0));
set_inuse_bit_at_offset(newp, newsize);
}
else {
remainder = chunk_at_offset(newp, nb);
set_head_size(newp, nb | (av != &main_arena ? NON_MAIN_ARENA : 0));
set_head(remainder, remainder_size | PREV_INUSE |
(av != &main_arena ? NON_MAIN_ARENA : 0));
set_inuse_bit_at_offset(remainder, remainder_size);
#ifdef ATOMIC_FASTBINS
_int_free(av, remainder, 1);
#else
_int_free(av, remainder);
#endif
}
nb
- 您需要的字节数,这里的
newsize
应该称为
oldsize
。因此,尽可能释放超过部分。
关于Mac OSX。 更精确地说,是有关来自Apple的malloc
当前实现的magazine_malloc
。 有关详细信息,请参见http://cocoawithlove.com/2010/05/look-at-how-malloc-works-on-mac.html。
realloc
调用区域重新分配方法,其当前实现在我看来是 szone_realloc
。对于不同的分配大小,存在不同的代码,但算法始终相同:
if (new_good_size <= (old_size >> 1)) {
return tiny_try_shrink_in_place(szone, ptr, old_size, new_good_size);
} else if (new_good_size <= old_size) {
return ptr;
}
如您所见,它的实现会检查new_size <= old_size / 2
,如果是,则释放内存,否则不执行任何操作。
malloc
或realloc
时,甚至没有分配内存... - Joep
的值。如果它确实改变了,那么你就知道 某些事情 发生了。 - Joerealloc()
不会重新分配缓冲区。其中一个原因是realloc()
可能会为了最小化碎片化而选择这样做,这取决于实现方式。最好查看realloc()
在这些平台上的官方接口文档。为了实现最大的可移植性,建议不要假定文档提供的内容之外的任何东西“按合同”存在。 - Dan Aloni