EBO(Empty Base Optimization)

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;
}

输出结果为EBO_1.png

对于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 {};


//sizeof(Empty) == 1 <- EBO机制
//sizeof(Empty1) == 1 <- EBO机制
//sizeof(Empty2) == 1 <- EBO机制
//sizeof(Empty3) == 1

前三个都是EBO的体现,但是Empty3继承了两次Empty,不符合EBO的规则,但实际上Empty3的大小仍为1。

:(===为啥是1===

EBO的准则:只有空类对象不与同一类型的其他对象或子对象分配在同一地址,就不需要为其分配空间。

同一地址的问题,即使是同一类型的对象只有分配地址不同,也不需要为其分配空间

我理解的不好,网址插个旗

https://blog.csdn.net/zhangxiao93/article/details/76038001