2015-11-07 25 views
4

當我使一個類與類指針等:編譯器如何爲類分配內存?

class A{ 
    B* p_b1; 
    B* p_b2; 
    A(){} 
} 

我假定編譯器爲每一個實例2個指針至少大小產生空間。我的問題是,如果他們不是指針,而是直線上升狀物體:

class A{ 
    B b1; 
    B b2; 
    A(){} 
} 

將編譯器類的存儲空間內分配空間,B1和B2的?或者它會在堆棧的其他地方聲明實際的B類?

我之所以問這個是因爲我想減少我的代碼中的內存分配,並遊蕩,如果它將使任何任何區別。

+0

什麼ü意味着其他地方在堆棧上?在你的例子中,b1,b2是在堆棧上創建的。如果你想減少內存分配,則使用較少的對象(包括一個對堆上創建) – Nandu

+0

也從來沒有編譯器分配空間。運行時間呢! – Nandu

+0

@Nandu是的,但機器需要爲堆棧中的每個對象分配內存。因此,我不得不問是否會將分配概括爲涵蓋所有內部對象。基本上「共享」堆棧分配。 – sgtHale

回答

4

編譯器會爲A類的內存空間中的b1和b2分配空間嗎?

是。

或者它會在棧上的其他地方聲明實際的B類嗎?

我之所以問這個是因爲我想減少我的代碼中的內存分配,並遊蕩,如果它將使任何任何區別號。

是的,它會有所作爲。在堆棧中分配內存比從堆中分配內存更有效。如果可以的話,當性能成爲問題時,更喜歡堆棧堆內存分配。

+0

是不是取決於問題?例如:對象向量Vs向量指針 - 堆棧VS堆 – Nandu

+0

即使在堆上創建類A的對象,第二個示例也會更有效,因爲它將導致一個堆分配而不是三個堆。 –

+0

@Nandu,當你有一個對象的矢量時,堆棧上沒有太多東西。大部分內存都在堆上。如果你有一個指針向量,你有兩個堆級別的內存,一個用於爲矢量的「數據」分配內存,另一個用於對象本身。 –

0

它實際上依賴。任何屬於對象字段的東西都將以與對象相同的方式分配(堆棧上或堆中的兩者)。如果你想減少分配,你可以考慮重用對象。您可以手動調用析構函數,然後調用placement new表達式來重用該對象的內存。

另一方面,如果您正在尋找簡單地減小所用堆棧的大小,則在構造函數的堆中進行分配並在析構函數中釋放(RAII)。