簡體   English   中英

在clang中使用realloc來縮小內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM