在clang中使用realloc来缩小内存

时间:2011-09-20 05:41:20

标签: c macos osx-lion clang realloc

我遇到涉及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字节。

铿锵有没有特别的原因呢?我唯一能想到的就是它可能为大小分配或其他东西分别保留。否则,移动内存似乎有点低效,当它可以截断旧内存块并继续使用它而不必复制数据时。

1 个答案:

答案 0 :(得分:3)

我曾经也想过这样的事情:Is realloc guaranteed to be in-place when the buffer is shrinking?

总结一下响应 - 允许realloc移动缓冲区,即使它只是缩小...具体细节取决于您的特定库实现。

来自c99(强调我的):

  

realloc函数返回指向新对象的指针(可能   具有与指向旧对象的指针相同的值,或空指针   如果无法分配新对象。

正如您所猜测的那样(并且根据链接问题中的一些回复)某些分配器显然会对堆进行分区,因此特定大小范围的分配来自同一个分配桶 - 在大量小对象可能会被遍布的情况下防止堆碎片,这将阻止分配大的连续块。

希望这有帮助。