# 类大小计算 首先来个总结,然后下面给出实际例子,实战! - 空类的大小为1字节 - 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间。 - 对于包含虚函数的类,不管有多少个虚函数,只有一个虚指针,vptr的大小。 - 普通继承,派生类继承了所有基类的函数与成员,要按照字节对齐来计算大小 - 虚函数继承,不管是单继承还是多继承,都是继承了基类的vptr。(32位操作系统4字节,64位操作系统 8字节)! - 虚继承,继承基类的vptr。 ## 1.原则1 ```c++ /** * @file blackclass.cpp * @brief 空类的大小为1字节 * @author 光城 * @version v1 * @date 2019-07-21 */ #include using namespace std; class A{}; int main() { cout< using namespace std; class A { public: char b; virtual void fun() {}; static int c; static int d; static int f; }; int main() { /** * @brief 16 字节对齐、静态变量不影响类的大小、vptr指针=8 */ cout< using namespace std; class A{ virtual void fun(); virtual void fun1(); virtual void fun2(); virtual void fun3(); }; int main() { cout< using namespace std; class A { public: char a; int b; }; /** * @brief 此时B按照顺序: * char a * int b * short a * long b * 根据字节对齐4+4+8+8=24 * * 或编译器优化 * char a * short a * int b * long b * 根据字节对齐2+2+4+8=16 */ class B:A { public: short a; long b; }; /** * 把A的成员拆开看,char为1,int为4,所以是1+(3)+4+1+(3)=12,()为字节补齐 */ class C { A a; char c; }; class A1 { virtual void fun(){} }; class C1:public A1 { }; int main() { cout< using namespace std; class A { virtual void fun() {} }; class B { virtual void fun2() {} }; class C : virtual public A, virtual public B { public: virtual void fun3() {} }; int main() { /** * @brief 8 8 16 派生类虚继承多个虚函数,会继承所有虚函数的vptr */ cout<