EBO概念
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <iostream>
using namespace std;
class A {};
class B1 { private: A a; };
class B2 { private: A a; int x; };
class C:private A { private: int x; };
int main() {
cout << sizeof(A) << endl; cout << sizeof(B1) << endl; cout << sizeof(B2) << endl; cout << sizeof(C) << endl; return 0; }
|
输出结果为
对于A这样一个空类,编译器会给这个空类安插一个char,来标识这个类。
对于B,由于字节对齐,B将占用8个字节。
对于B1来说,A的大小为1,int大小为4,一共为5,字节补齐将其补齐为8(4的倍数)。
对于B2来说,直接继承然后添加一个int,空间为5,并未进行补齐。1的补齐所浪费的空间是巨大的。EBO机制存在的意义就在此。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Empty {};
class Empty1 : public Empty {};
class Empty2 : public Empty1 {};
class Empty3 : public Empty,Empty1 {};
|
前三个都是EBO的体现,但是Empty3继承了两次Empty,不符合EBO的规则,但实际上Empty3的大小仍为1。
:(===为啥是1===
EBO的准则:只有空类对象不与同一类型的其他对象或子对象分配在同一地址,就不需要为其分配空间。
同一地址的问题,即使是同一类型的对象只有分配地址不同,也不需要为其分配空间
我理解的不好,网址插个旗
https://blog.csdn.net/zhangxiao93/article/details/76038001