我們如何才能找到對象長期和 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上運行的程序中實現了它,並且我只是簡單地詢問我的分配器以查找多少內存我的每個容器都使用。
'sizeof'是一個運算符,而不是一個函數。 – 2010-01-29 06:39:51
@Carl Norum:你是對的。謝謝你的提醒! – 2010-01-29 06:41:19
嗯。這看起來沒有用,原因有兩個:成員是私有的,並且不允許你使用非靜態成員變量的大小。有趣! – 2010-01-29 06:43:18