2017-09-13 37 views
3

假設我有一些只有成員是int的類。如果它不在一個類中,那麼int就是4個字節。該類是否佔用超過4個字節的內存(使用C++)?在C++中,類的內存大於其成員嗎?

+0

如果您在類有虛函數,那麼是的。否則,不。但它通常是一個(編譯器)實現決定,即不是由C++語言的標準定義的。順便說一句,'int'的大小也是4個字節。 – goodvibration

回答

5

關於一個類最終有多大的決定是特定於實現的,並且取決於很多不同的因素。有時,由於結構和類填充,一個類最終可能會比其成員的大小更大。如果您的班級中有任何虛擬功能,那麼您通常最終會在類的前面添加virtual function table pointer(vtable指針),這會增加一些空間。編譯器完全有可能爲了The Heck Of It讓你的類比它的成員大,如果它認爲它會以某種方式幫助你(或者你有一個懶惰的編譯器!)

在你的例如,使用一個32位整數,如果類最終大於整數本身,我會感到驚訝,因爲您沒有使用任何虛函數,並且沒有任何成員可以在它們之間插入填充字節。但是,您不一定需要跨系統依賴這一點。

如果你在一個應用程序的工作,其中很絕對必要您的類相同大小的領域 - 也許,例如,如果你正在讀原始字節,並想重新解釋爲類對象 - 你可以使用一個static_assert檢查此:

class MyClass { 
    ... 
}; 
static_assert(sizeof(MyClass) == sizeof(int), "MyClass must have the same size as an integer."); 

許多編譯具有自定義選項(往往是通過#pragma指令),你可以調整,以確保課程獲得您想要的方式大小,所以你可以也考慮閱讀。

+0

'#pragma pack(push,1)'(在類定義之後加上'#pragma pack(pop)',以確保它隻影響目標類)適用於MSVC和GCC。 – Xirema

+0

我其實只是出於好奇而問,我沒有打算將它用於任何事情。 – BadProgrammer99

0

實際大小取決於實現,所以由於填充和其他實現細節,它可以在不同的編譯器和體系結構中更改。永遠不要相信一個簡單的總和如以下僞代碼:

size = sizeof(member1) + ... + sizeof(memberN) 

此外,如果類有虛函數,是的,它可以超過4個字節。

此外,虛函數和類繼承的情況下的尺寸可以是複雜的第一眼應理解:

  • 每個類包括虛擬功能將存儲在存儲器中以函數指針到這些一個虛函數表虛擬功能。
  • 帶有虛函數的A類從另一個具有虛函數的B類繼承,可能需要多個表來存儲A和B函數指針。

詳情請參閱這樣的回答:how to determine sizeof class with virtual functions?

+1

請將問題標記爲重複,而不是將其鏈接到另一個答案中。 – user0042

+0

這對我來說不是重複的,而是更通用的。 – auserdude

+0

然後你應該發佈評論。 – user0042