2016-04-03 48 views
0

我目前一直在使用可能會創建重量較大的對象的庫。具體來說,我正在創建與wave文件關聯的對象。如何檢測對象是否主要由堆棧或動態內存組成

現在創建波對象的實例(只是爲例)時,有沒有確定它在內存中被分配一個好辦法嗎?

例如,如果我實例在堆棧一個std ::矢量,我知道一些存儲器被分配在堆(即頭信息)和實際容器數據在堆中創建。所以大部分情況下,我不必擔心堆棧內存溢出。儘管我仍然可以選擇在堆中完全實例化對象。

但是讓我們說我不知道​​對象的實現。假設我正在使用一個在堆棧中創建大量數組的庫。這可能會導致問題。

所以我的問題:我們怎麼知道一個對象是如何「沉重」的記憶方式?

+0

簡短的回答是:你不能。至少除非你使用工廠parttern,否則總是在堆上實例化你的對象。在這種情況下,答案總是「堆」,當然。 –

回答

3

我要去承擔分配堆棧內存的額外標準的方法是關閉表(alloca和朋友)。

鑑於這種情況,很簡單:把sizeof的對象。

C++是一種靜態類型語言,但其對象也是靜態的大小爲。每種類型的大小都必須在編譯時確定。很多C++都依賴於此。所以如果你擔心某個物體佔據了太多的堆棧空間,那隻能是因爲物體佔據了這個空間。

請注意,這不會阻止您調用本身使用大量堆棧空間的功能。沒有什麼可以做的檢測。但是你可以通過一些任意的測量來判斷給定對象的大小是否會很大。

+0

我明白了。由於某種原因,我想你可以有一個成員std :: array的對象,其大小可能會因對象的構造函數調用而有所不同...但是數組的大小必須是固定的,並且不能改變。 – Izzo