#includeusing namespace std; struct Test //24,对齐数 = 8 { int age; //0 long long id_num; //8 short school_num; //16 }; //结构体大小:(1 + (7) + 8 + 2) + 6 = 24 class PeoPle { public: PeoPle() {} void func() { cout << "PeoPle::func" << endl; } private: char a; //0 short b; //2,对齐数 = 2 char c; //4 int e; //8,对齐数 = 4 long long f; //16,对齐数 = 8 char g; //24 Test test; //32,对齐数 = 8 char h; //56 }; //VS的默认对齐参数为8 //上面People类所占空间: //(1 + (1) + 2 + 1 + (3) + 4 + (4) + 8 + 1 + (7) + 24 + 1) + 7 = 64 //类的成员函数指针存储在公共空间处,不同的类对象调用同一个成员函数指针 int main() { cout << sizeof(Test) << endl; //24 cout << sizeof(PeoPle) << endl; //64 PeoPle* p = nullptr; //PeoPle::func p->func(); return 0; }
类的大小 = 基类的大小 + 成员变量大小 + 非虚类基的大小 + 虚函数指针大小
- 成员变量不包括静态(static)变量,并且要考虑函数对齐
- 虚函数可能有多个
- 类的成员函数存储在公共空间内
- 空类占1字节
内存对齐规则:
- 第一个成员变量在与结构体偏移量为0的位地址处;
- 其他成员变量要对齐到该成员对齐数的整数倍的地址处;
- 对齐数 = 编译器默认的对齐数与该成员大小的较小值 (VS中默认对齐数为8);
- 结构体(类)的总大小:最大对齐数(所有变量的最大者与默认对齐的较小值)的整数倍;
- 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍,总结构体的整体大小是最大对齐数(含嵌套结构体的对齐数)的整数倍



