2010-06-22 32 views
3

當使用'new'創建數組並使用'delete'操作符刪除數組時,delete知道數組的大小。正如其他SO線程中提到的,這個大小信息存儲在元數據中。當使用new int [10]時元數據需要多少內存?

我的問題:元數據中究竟存儲了什麼,需要多少空間?它只是存儲在元數據中的大小嗎?

+1

標準隻字未提它據我所知,依賴於實施我猜。 – 2010-06-22 04:36:48

回答

8

根據C++標準5.3。 0.4/12:

new T[5] results in a call of operator new[](sizeof(T)*5+x), 

< ...>其中x是表示陣列分配開銷的非負非指定值。 < ...>開銷的金額 可能因新的調用而不同。

+0

+1,感謝標準參考:) – 2010-06-22 04:42:07

0

這種問題是非常具體的編譯器和plataform。每個編譯器都以不同的方式實現它。該標準說什麼應該實施,不完全如何實施。

當然,這個元數據必須包含數組大小或其他一些信息,這些信息可以讓我們推斷出它。否則,我們將無法調用數組中所有對象的析構函數。

4

它是實現定義的。我會說至少有四個字節的長度,但也可能有「下一個」和「前一個」指向相鄰塊的指針。運行時可能會有一個「魔術」數字,以確保您沒有意外覆蓋其內存部分等等。

但是你不應該爲此擔心。事實上,對於像你的int[10]這樣的小數組(40字節),你可能會發現最大數量的空間實際上是通過填充佔用的(例如,可能會添加24個字節的填充以使分配成爲32 - 這可能由於性能原因做,說

在一天結束的時候,不過,正如我說,這完全取決於執行情況,以決定他們是如何做到這

0

這將取決於您的標準庫。即使malloc()也需要數據來知道分配了多少字節。舉一個例子,看看glibc的malloc的:

http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=malloc/malloc.c;hb=HEAD

每個分配塊的最低開銷:4或8個字節

Each malloced chunk has a hidden word of overhead holding size 
    and status information. 
+0

這是一個特定的malloc實現。我寫了一個指針值本身編碼信息的東西 - 今天更加微不足道的是,它有64位指針。 – MSalters 2010-06-22 07:25:25

+0

@ MSalters:我很好奇以及爲什麼。我無法弄清楚我的頭頂如何用通用的malloc做這件事(對於不同的對象大小沒有不同的內存池) – 2010-06-22 07:36:57

+0

您得到了解決方案:針對不同對象大小的不同內存池。您通常可以從操作系統以小於4 KB的塊分配內存,並且您需要的池數量相當有限。如果將分配的權重設置爲2,則只有12個不同的池大小(最大爲4KB)(操作系統直接分配4KB以上)。浪費最多爲12 * 4KB,通常爲12 * 2KB。這意味着當你有幾千個小的分配時它就變得有效率,並不罕見。 – MSalters 2010-06-22 07:47:41