空类
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的大小 }