我遇到涉及realloc的clang下的代码问题。这段代码在gcc和visual studio下运行正常,所以我对理解clang的行为感兴趣。我们的代码做了类似的事情(错误处理等等):
// allocate way more memory than we need
char * memory = malloc(500000);
int memoryused = 0;
// ... code goes here that fills up the memory, keeping track by
// setting memoryused ...
// now we're done, shrink the memory down to the size it needs
memory = realloc(memory, memoryused);
在gcc和多个版本的MSVC下,内存指针未被移动。然而,在clang下,它似乎会移动内存,即使所需的大小只有1-2000字节。
铿锵有没有特别的原因呢?我唯一能想到的就是它可能为大小分配或其他东西分别保留。否则,移动内存似乎有点低效,当它可以截断旧内存块并继续使用它而不必复制数据时。
答案 0 :(得分:3)
我曾经也想过这样的事情:Is realloc guaranteed to be in-place when the buffer is shrinking?
总结一下响应 - 允许realloc
移动缓冲区,即使它只是缩小...具体细节取决于您的特定库实现。
来自c99
(强调我的):
realloc函数返回指向新对象的指针(可能 具有与指向旧对象的指针相同的值,或空指针 如果无法分配新对象。
正如您所猜测的那样(并且根据链接问题中的一些回复)某些分配器显然会对堆进行分区,因此特定大小范围的分配来自同一个分配桶 - 在大量小对象可能会被遍布的情况下防止堆碎片,这将阻止分配大的连续块。
希望这有帮助。