2012-04-11 60 views
4

塊分配與單獨對象分配的主要區別是什麼?比方說說C++對象塊分配與個人分配

int iCount = 5; 

int i = 0; 
while(i < iCount) 
{ 
    f = new foo(); 
i++; 
} 

////////////////// 
foo* f = new foo[iCount]; 

那第二種方法會爲我節省一些內存空間嗎? 我聽說我們分配的每個對象都被16個管理字節包圍。所以塊分配將只使用一個頭部守衛。這是真的嗎?

+0

我聽說我們分配的每個對象都被16個管理字節包圍。所以塊分配將只使用一個頭部守衛。這是真的嗎? – nsa 2012-04-11 16:36:10

+0

我沒有聽說過這個傳言。另一方面,'new []'可能需要將'iCount'存儲在某處,以便delete []'可以找到它。也許這會使用更多的內存,而不是更少? – 2012-04-11 16:57:44

回答

3

你做的每個分配還分配了分配頭(有時候還有一些腳註保護結構),它依賴於你的分配器使用的算法。 Here,你可以找到其中一種算法的描述。

當分配一個數組,分配器(主要是malloc())將與sizeof(element) * count被稱爲參數和將分配整個陣列作爲一個塊,使用一個報頭結構,所以它會比分配元件引入較少的內存開銷一個接(見底部的註釋)。

無論如何(因爲問題的標籤是),好的C++程序員應該避免手動管理內存。對於數組,使用標準庫類(vector,maplist等)。儘可能使用RAII,不要使用原始指針,而要使用「智能」指針。


注:我寫了這裏的一切完全取決於所使用的算法,所以關於數組分配的那款可能並不適用於所有可能的內存分配算法。因此,直接回答「塊分配與個體對象分配之間的市長差異是什麼」也是依賴於算法的。

+0

[link] https://docs.google.com/viewer?a=v&q=cache:pYPYfnZDX1IJ:www.cs.princeton.edu/courses/archive/fall06/cos217/lectures/14Memory-2x2.pdf+&hl=烯&GL = LK&PID = BL&srcid = ADGEESiIr1Gl8BNo_aT5qF2e-ZWHRCtXfJBj699onMJs4Gg9Q9n-urnYOPwT2pflgd5OmA-VHRHWAsDWxnQLb9HsbbpBcmAfXrC_VX9QfRvB9KYNtcOIoljYMEb6DOiiiAEk7Nwlbap4&SIG = AHIEtbQrgAdEyk2TJ09oUvjMrrYnLfPvNQ&PLI = 1 – nsa 2012-04-30 06:29:08

1

另一個非常重要的區別是異常安全。在您的代碼:

int iCount = 5; 
int i = 0; 
while(i < iCount) 
{ 
    f = new foo(); 
    i++; 
} 

你必須非常,非常小心,不會產生內存泄漏本;你一定要記住所有的foo,以便在異常的情況下能夠正確清理這個。如果這段代碼在構造函數中,那麼僅僅在析構函數中釋放這些代碼是不夠的,因爲如果拋出異常,那麼你的對象永遠不會生效,析構函數也不會被調用。這進一步傳播到編寫正確的拷貝構造和拷貝賦值,每個異常安全等

道德:使用標準集裝箱,像vectorlist,或deque(還有更多)。

////////////////// 
foo* f = new foo[iCount]; 

這將至少摧毀每一個構造foo如果有異常分配的第一個和最後foo之間拋出。

當然,您必須注意f將被正確刪除,特別是如果有其他的throw-point代碼執行此分配。

道德:使用標準容器。乍一看手動內存管理可能看起來微不足道,尤其是如果你來自C語言,但編寫異常安全的代碼並不重要也非常關鍵。