2014-07-24 192 views
1

我有這個類:大小不匹配

class MyClass{ 
    public: 
     shared_ptr<X> a; 
     shared_ptr<Y> b; 
     std::string c; 
     std::vector<double> d; 
     std::vector<shared_ptr<Z>> e; 
     int f; 
}; 

,當我編譯上VS2012與交換機看到客艙佈局我得到這個:

1> class MyClass size(128): 
1>  +--- 
1> 0 | {vfptr} 
1> 8 | [email protected]@@ a 
1> 24 | [email protected]@@ b 
1> 40 | [email protected][email protected]@[email protected]@[email protected]@[email protected] c 
1> 72 | [email protected][email protected]@[email protected]@ d 
1> 96 | [email protected][email protected]@@@[email protected]@[email protected][email protected]@@@[email protected]@@[email protected]@ e 
1> 120 | f 
1>  | <alignment member> (size=4) 
1>  +--- 

它意味着數據成員c是32個字節。

但是,如果我在我的平臺(Win 7 64)上做sizeof(std::string),使用MSVC11,我會得到40個字節。

爲什麼sizeof()給我40,但上面的編譯器內存佈局意味着32?

+0

爲什麼當沒有虛擬函數的類時會顯示一個vtable指針? –

+0

@MobyDisk我刪除了專注於數據成員的方法。 – user997112

+0

@ user997112:不要刪除你認爲不重要的東西。向我們展示您編譯的* exact *代碼以及您爲該代碼獲得的* exact *輸出。 –

回答

-1

數據成員c可能是一個指向字符串對象的指針。由於std :: string存儲了一個可變大小的字符串,因此您無法在該空間中安裝任何您想要的東西。

所以它是一個指針,由語言管理,而不是由您來管理。

+0

..和一個指針是40個字節?這是一些填充問題(==成員對齊,編譯包等)。希望OP能澄清確切的設置。 –