malloc(0)分配多少內存?(譯文)

原文地址:http://prog21.dadgum.com/179.htmlhtml

  在大多的系統中,這個C的小程序將會吸取所有空閒的內存。小程序

while(1){ malloc(0); }

在咱們聊malloc(0)以前,讓咱們看看malloc(1)這個更簡單的狀況。spa

   這有一個關於malloc的新的有趣的C程序問題:」用一個指針去動態的分配內存,咱們能怎樣決定它指向多少字節(byte)?「這個答案是使人沮喪的「你不能決定。」可是當你調用free在相同的指針,內存分配知道這個塊(block)有多大,因此它存儲在計算機某個地方。這個地方通常是相鄰分配內存,以及分配器須要的任何其餘實現特定的數據。指針

  在廣泛的dlmalloc的實現中,在4~16字節的這個開銷被添加到一個請求中,根據庫怎樣被預編譯和是否指針是32或者64位。8字節對於64位系統是一個合理的猜想。code

  更糟糕的事情是,一個最小的塊可以被malloc返回。對齊是緣由之一。若是有一個整型大小的空間被隱祕的向每一個塊中添加,那麼它不會有意義對於分配一個比整型更小的塊。但也有另外一個緣由:當一個塊是空閒的時候,它會被某種方式追蹤。或許它進入一個鏈表,或者進入一個樹中,或者一些更有趣的。無論怎樣,指針或者其餘的數據讓工做不得不去某個地方,而在剛剛釋放的塊中則是自由的選擇。htm

  在dlmalloc中,一個64位系統中最小被容許分配的大小是32位。回到malloc(1)的問題,8字節的開銷被添加到咱們須要的單個字節中,而且總共一塊兒的是比最小的32更小,因此咱們的答案是:malloc(1)分配32字節。blog

  如今咱們可以着手處理分配0字節的問題。它證實事實會有一個愚蠢的辯論,而且它尚未被解決,因此技術上分配0字節是特定於實現的行爲。一面認爲malloc(0)應該返回一個空指針並完成它。它執行,若是你不介意一個空的返回值服務雙重責任。它也意味着「內存外」或者「你不須要任何內存。」內存

  更加廣泛的形式是malloc(0)返回一個特別的指針。你不該該引用那個指針,由於它是概念上的指向0字節,從上文的探討咱們得知,至少dlmalloc在64位系統中將老是分配一個32字節的塊,因此這個最後的答案:它須要32字節來知足你分配無內存的請求get

相關文章
相關標籤/搜索