假設我有一些只有成員是int的類。如果它不在一個類中,那麼int就是4個字節。該類是否佔用超過4個字節的內存(使用C++)?在C++中,類的內存大於其成員嗎?
回答
關於一個類最終有多大的決定是特定於實現的,並且取決於很多不同的因素。有時,由於結構和類填充,一個類最終可能會比其成員的大小更大。如果您的班級中有任何虛擬功能,那麼您通常最終會在類的前面添加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
指令),你可以調整,以確保課程獲得您想要的方式大小,所以你可以也考慮閱讀。
'#pragma pack(push,1)'(在類定義之後加上'#pragma pack(pop)',以確保它隻影響目標類)適用於MSVC和GCC。 – Xirema
我其實只是出於好奇而問,我沒有打算將它用於任何事情。 – BadProgrammer99
實際大小取決於實現,所以由於填充和其他實現細節,它可以在不同的編譯器和體系結構中更改。永遠不要相信一個簡單的總和如以下僞代碼:
size = sizeof(member1) + ... + sizeof(memberN)
此外,如果類有虛函數,是的,它可以超過4個字節。
此外,虛函數和類繼承的情況下的尺寸可以是複雜的第一眼應理解:
- 每個類包括虛擬功能將存儲在存儲器中以函數指針到這些一個虛函數表虛擬功能。
- 帶有虛函數的A類從另一個具有虛函數的B類繼承,可能需要多個表來存儲A和B函數指針。
詳情請參閱這樣的回答:how to determine sizeof class with virtual functions?
- 1. 哪裏的類,方法及其成員存儲在內存中?
- 2. 這是內存泄漏嗎?試圖重置類類的類成員。 C++
- 3. 基於其他成員類型的條件成員類型
- 4. c中內部類的訪問成員#
- 5. C++刪除析構函數中的向量類成員內存
- 6. C++模板類成員函數,依賴於其他模板類
- 7. 會分配一個類的數組成員的內存嗎?
- 8. 內存對齊到結構中 - 對齊大小等於最大成員大小
- 9. 內存中的C#成員數組內存#
- 10. 正在初始化類成員依賴於其他類的成員
- 11. C++初始化類成員變量取決於其他成員變量
- 12. C#中的類成員
- 13. C++類成員
- 14. C++,類成員
- 15. 類成員和成員函數的內存位置
- 16. 類參考成員指向同一類中的其他成員
- 17. C++類成員的生存期
- 18. C++訪問其他類公共成員
- 19. 不允許任何成員函數在C++類中更改其數據成員
- 20. C++成員函數和類大小
- 21. C++矢量大小爲類成員
- 22. 通過其他類持續存在的類成員
- 23. 問題與使用類在C++其他類的數據成員
- 24. 基於另一個成員類型C#的.NET類成員類型
- 25. 在C中訪問大於UINT_MAX * 4大小的內存?
- 26. 在C++/CLR類中的成員CComPtr
- 27. 在C++ 14中,constexpr成員可以更改數據成員嗎?
- 28. 類的對象可以是其他類的成員變量嗎?
- 29. C++(非內置/類)靜態成員
- 30. C++類的設計:在其他類成員中共同使用類成員;小界面vs小班
如果您在類有虛函數,那麼是的。否則,不。但它通常是一個(編譯器)實現決定,即不是由C++語言的標準定義的。順便說一句,'int'的大小也是4個字節。 – goodvibration