2010-01-29 59 views
19
class Help 
{ 
public: 
     Help(); 
     ~Help(); 

     typedef std::set<string> Terms; 
     typedef std::map<string, std::pair<int,Terms> > TermMap; 
     typedef std::multimap<int, string, greater<int> > TermsMap; 

private: 

     TermMap terms; 
     TermsMap termsMap; 
}; 

如何通過對象termtermsMap找到使用(以字節爲單位)的內存。我們有圖書館嗎?如何查找任何對象使用的內存

回答

-1

sizeof()運營商應該做的是:

size_t bytes = sizeof(Help::TermMap); 
+5

'sizeof'是一個運算符,而不是一個函數。 – 2010-01-29 06:39:51

+1

@Carl Norum:你是對的。謝謝你的提醒! – 2010-01-29 06:41:19

+1

嗯。這看起來沒有用,原因有兩個:成員是私有的,並且不允許你使用非靜態成員變量的大小。有趣! – 2010-01-29 06:43:18

1

如果你正在尋找的實際內存塊的指針,它的數值應該是它。 (然後只需添加字節數,並且您有塊的結尾)。

12

如果您正在尋找一個對象的全部內存使用情況,這通常無法在C++中解決 - 雖然我們可以通過sizeof()獲取實例本身的大小,但該對象始終可以根據需要動態分配內存。

如果你能找出一個容器中的各個元素有多大,你可以得到一個下界:

size = sizeof(map<type>) + sum_of_element_sizes; 

但請記住,該容器仍然可以分配更多的內存作爲實現細節,對於像vectorstring這樣的容器,您必須檢查allocated size

+0

考慮到這是一個粗略的低估。在許多情況下,像地圖一樣,STL必須包含其他東西(地圖是平衡樹,所以它至少需要三個指針(左邊,右邊,父 - 父來保證快速迭代器橫向)以及一些保持信息的方式平衡不變,可能是一個額外的值(整數,彩色字節)...和元素大小必須同時考慮密鑰和值。 – 2010-01-29 08:19:57

+0

David,將其更改爲*下限*以使其更清晰,其餘應該是覆蓋*實現細節*。 – 2010-01-29 09:09:21

7

簡短的回答:沒有

龍答:
- >基本對象是。 sizeof(<類型>)但這隻對有限的事情有用。
- >容器及其包含的成員:NO

如果您對用於實現這些目標的結構假設你可以估計它。但即使這樣也不是很有用(除了矢量的特定情況外)。

STL的設計者故意沒有定義這些容器應該使用的數據結構。這有幾個原因,但其中一個原因(在我看來)是阻止人們對內部進行假設,從而嘗試去做那些沒有被界面封裝的愚蠢的東西。

所以這個問題歸結爲爲什麼你需要知道尺寸?
你真的需要知道大小(不太可能,但可能)。

或者有沒有一項任務是您試圖實現的,您認爲您需要的尺寸?

8

我們如何才能找到對象長期和 termsMap使用的內存(在 字節)。我們有圖書館嗎?

您應該使用您自己的分配器類型。

typedef std::set<string, 
    your_allocator_1_that_can_count_memory_consumption_t> Terms; 

typedef std::map<string, std::pair<int,Terms>, 
    your_allocator_2_that_can_count_memory_consumption_t> TermMap; 

typedef std::multimap<int, string, greater<int>, 
    your_allocator_3_that_can_count_memory_consumption_t> TermsMap; 

我還沒有檢查這個想法的std :: string,所以如果它是很難實現只使用自己的類fixed_string這只是包裝個char [MAX-串lenght。

而當你需要在你的程序中找出內存消耗時,只需從your_allocator_1_that_can_counts_memory_consumption_t,your_allocator_2_that_can_counts_memory_consumption_t, your_allocator_3_that_can_counts_memory_consumption_t得到它。

編輯

對於UncleBens我想澄清我的觀點。

就我所瞭解的ARV問題而言,有必要知道爲set :: set和std :: map分配了多少內存,包括爲該集合和地圖的元素分配的所有內存。所以它不只是sizeof(術語)。

所以我只是建議一個非常簡單的分配器。沒有進入太多細節,可能是這樣的:

template <class T> 
class your_allocator_1_that_can_counts_memory_consumption_t { 
public: 
    // interfaces that are required by the standart 
private: 
    std::allocator<T> std_allocator_; 
    // here you need to put your variable to count bytes 
    size_t globale_variable_for_allocator_1_to_count_bytes_; 
}; 

這個分配器只計算分配和釋放的字節數和真正的分配和釋放使用它的成員std_allocator_。我可能需要在gdb下調試它,以便在malloc()和free()上設置一個斷點,以確保每次分配和釋放實際都通過我的分配器。

如果您將此意見指向某些問題,我將不勝感激,因爲我已經在我的Windows,Linux和HP-UX上運行的程序中實現了它,並且我只是簡單地詢問我的分配器以查找多少內存我的每個容器都使用。

+1

我懷疑,除非你的分配器使用了一些非常特定於操作系統的分配例程,否則你甚至無法告訴內存使用情況如果我沒有弄錯,如果你的代碼包含高級別爲'malloc(n);'它可能仍然是完全實現定義實際得到多少內存「用完」。 – UncleBens 2010-01-29 20:28:57

+0

查看已編輯的部分。 – 2010-01-30 10:46:04

+0

關於'它可能仍然完全實現ation定義了多少內存實際上被「用完」了。那是真實的。例如,在HP-UX上,當您詢問5個字節時,實際上已經分配了16個字節,因爲libc關心內存碎片。 但是,我還從HP-UX/Linux獲得有關分配給進程的內存量的信息。結果我知道真正的內存消耗更大。 順便說一句,ARV沒有說他想知道容器的確切內存消耗,包括libc可能會添加什麼內容。 – 2010-01-30 11:09:16

相關問題