[英]Using realloc in clang to shrink memory
我在涉及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字節。
鏗鏘有沒有特別的原因呢? 我唯一能想到的就是它可能為大小分配或其他東西分別保留。 否則,移動內存似乎有點低效,當它可以截斷舊內存塊並繼續使用它而不必復制數據。
我曾經想過這樣的事情: 當緩沖區縮小時,realloc是否保證就位?
總結一下響應 - 允許realloc
移動緩沖區,即使它只是縮小......具體細節取決於你的特定庫實現。
從c99
(強調我的):
realloc函數返回指向新對象的指針( 可能與指向舊對象的指針具有相同的值),如果無法分配新對象,則返回空指針。
正如您所猜測的那樣(並且根據鏈接問題中的一些響應), 一些分配器顯然會對堆進行分區,因此特定大小范圍的分配來自相同的分配桶 - 在大量小的情況下防止堆碎片否則可能會散布對象,這會阻止分配大的連續塊。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.