塊分配與單獨對象分配的主要區別是什麼?比方說說C++對象塊分配與個人分配
int iCount = 5;
int i = 0;
while(i < iCount)
{
f = new foo();
i++;
}
//////////////////
foo* f = new foo[iCount];
那第二種方法會爲我節省一些內存空間嗎? 我聽說我們分配的每個對象都被16個管理字節包圍。所以塊分配將只使用一個頭部守衛。這是真的嗎?
塊分配與單獨對象分配的主要區別是什麼?比方說說C++對象塊分配與個人分配
int iCount = 5;
int i = 0;
while(i < iCount)
{
f = new foo();
i++;
}
//////////////////
foo* f = new foo[iCount];
那第二種方法會爲我節省一些內存空間嗎? 我聽說我們分配的每個對象都被16個管理字節包圍。所以塊分配將只使用一個頭部守衛。這是真的嗎?
你做的每個分配還分配了分配頭(有時候還有一些腳註保護結構),它依賴於你的分配器使用的算法。 Here,你可以找到其中一種算法的描述。
當分配一個數組,分配器(主要是malloc()
)將與sizeof(element) * count
被稱爲參數和將分配整個陣列作爲一個塊,使用一個報頭結構,所以它會比分配元件引入較少的內存開銷一個接(見底部的註釋)。
無論如何(因爲問題的標籤是c++),好的C++程序員應該避免手動管理內存。對於數組,使用標準庫類(vector
,map
,list
等)。儘可能使用RAII,不要使用原始指針,而要使用「智能」指針。
注:我寫了這裏的一切完全取決於所使用的算法,所以關於數組分配的那款可能並不適用於所有可能的內存分配算法。因此,直接回答「塊分配與個體對象分配之間的市長差異是什麼」也是依賴於算法的。
[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
另一個非常重要的區別是異常安全。在您的代碼:
int iCount = 5;
int i = 0;
while(i < iCount)
{
f = new foo();
i++;
}
你必須非常,非常小心,不會產生內存泄漏本;你一定要記住所有的foo
,以便在異常的情況下能夠正確清理這個。如果這段代碼在構造函數中,那麼僅僅在析構函數中釋放這些代碼是不夠的,因爲如果拋出異常,那麼你的對象永遠不會生效,析構函數也不會被調用。這進一步傳播到編寫正確的拷貝構造和拷貝賦值,每個異常安全等
道德:使用標準集裝箱,像vector
,list
,或deque
(還有更多)。
//////////////////
foo* f = new foo[iCount];
這將至少摧毀每一個構造foo
如果有異常分配的第一個和最後foo
之間拋出。
當然,您必須注意f
將被正確刪除,特別是如果有其他的throw-point代碼執行此分配。
道德:使用標準容器。乍一看手動內存管理可能看起來微不足道,尤其是如果你來自C語言,但編寫異常安全的代碼並不重要也非常關鍵。
我聽說我們分配的每個對象都被16個管理字節包圍。所以塊分配將只使用一個頭部守衛。這是真的嗎? – nsa 2012-04-11 16:36:10
我沒有聽說過這個傳言。另一方面,'new []'可能需要將'iCount'存儲在某處,以便delete []'可以找到它。也許這會使用更多的內存,而不是更少? – 2012-04-11 16:57:44