1.?計算類對象的大小
????????類實例化的對象中只存儲成員變量,不存儲成員函數,函數要用是通過 this 指針拿的。因為一個類可以實例化出 N 個對象,每個對象的成員變量都可以存儲不同的值,但是調用的函數卻是同一個。如果每個對象都成員函數,每個成員函數都是同樣的,就會浪費空間。
????????如果我們需要計算一個類實例化出的對象的大小,那就只用考慮成員變量占用內存之和(和結構體占用內存大小一樣,需要考慮內存對齊規則)
// 類中既有成員變量,又有成員函數
class A1 {
public:void f1() {}
private:int _a;
};// 類中僅有成員函數
class A2 {
public:void f2() {}
};// 類中什么都沒有---空類
class A3
{};int main()
{A1 a1;A2 a2;A3 a3;// 打印每個類實例化后的對象的大小// 沒有成員變量的類的大小是 1cout << sizeof(a1) << endl; // 4字節cout << sizeof(a2) << endl; // 1字節cout << sizeof(a3) << endl; // 1字節return 0;
}
????????為什么沒有成員變量的類的對象的大小是 1 字節,而不是 0 字節?
????????此時開一個字節不是為了存數據,而是占位,表示對象存在。不然,遇到下面這種情況:
// 類中什么都沒有---空類
class A3
{};int main()
{A3 a1;A3 b1;A3 c1;
}
????????如果沒有成員變量的類的大小是 0 字節,此時如果對 a1,b1,c1 取地址,那該得到什么樣的地址呢?所以需要一個字節占位。
2. 結構體內存對齊規則
1. 第一個成員在與結構體偏移量為0的地址處。
2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
????????注意:對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。
????????VS中默認的對齊數為8
3. 結構體總大小為:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍。
4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。