空类

1.empty class:意味着对象不使用任何空间,因为没有任何隶属对象的数据需要存储.(即类不包含任何non-static成员变量,没有virtual函数,没有virtual base),但c++规定独立(非附属)对象必须有非零大小。

1 class a{};
2 int main()
3 {
4     a a;
5     cout << sizeof(a) << endl;
6 }

 1 class a
 2 {
 3 };
 4 
 5 class b:a
 6 {
 7     int bb;
 8     a aa;   
 9 };
10 int main()
11 {
12      b b;
13     cout << sizeof(b) << endl;   //sizeof(bb)=4,sizeof(aa)=1,内存对齐后为8
14 }

2.static 变量存储在全局/静态存储区,被所有对象共享,不占用对象的存储空间

 1 class a
 2 {
 3     static int i;
 4     static int j;
 5 };
 6 int main()
 7 {
 8     a a;
 9     cout << sizeof(a) << endl;
10 }

3.包含虚函数的类,对象会包含一个vptr(虚函数表指针)

 1 class a
 2 {
 3 public:
 4     virtual void fun1(){}
 5     virtual void fun2(){}
 6 };
 7 int main()
 8 {
 9     a a;
10     cout << sizeof(a) << endl;   //vptr大小,指针为4
11 }

4.不能包含虚基类,包含虚基类的对象也包含一个指针

 1 class a
 2 {
 3     int aa;
 4 };
 5 
 6 class b :virtual public a
 7 {
 8     int bb;
 9 };
10 int main()
11 {
12      b b;
13     cout << sizeof(b) << endl;   //sizeof(a::aa)+sizeof(b::bb)+sizeof(指针)
14 }

5.空白基类最优化(EBO):在单一继承里,基类为空类,则派生类从基类继承而来的部分不占内存(注意区别1.中的第二种情况)

 1 class a
 2 {};
 3 
 4 class b:a
 5 {
 6     int bb;
 7 };
 8 int main()
 9 {
10      b b;
11     cout << sizeof(b) << endl;
12 }

但在多继承里,EBO不成立

class a {};
class aa{};
class b:a,aa
{
    int bb;
};
int main()
{
     b b;
     cout << sizeof(b) << endl;   //sizeof(bb)+a的大小+aa的大小
}

原文地址:https://www.cnblogs.com/mrlsx/p/5869306.html