C++空白基类最优化(EBO或EBCO)

对于C++中的一个空类 

 

class X

 {

 }; 

 

事实上并不是空的,sizeof(X)并不等于0 一般的结果是1。每个X的对象都有一个隐晦的1bytes,是被编译器安插进去的一个char,这样可以使得这个class的两个objects在内存中配置独一无二的地址。

 

X作为另一个类的成员时,如:

 

class A

 {

 public:

   X x;

   int a;

 };

 

由于X占一个字节,int4个字节,再加上编译器的alignment调整,sizeof(Y) = 8

 

但是当一个类继承X时:

 

class Y :public X

 {

 public:

   int a;

 };

 

这时大部分编译器对于sizeof(Y)的结果是4,而不是8。这就是所谓的空白基类最优化在(empty base optimization-EBO empty base classopimization-EBCO)。在空基类被继承后由于没有任何数据成员,所以子类优化掉基类所占的1 byteEBO并不是c++标准所规定必须的,但是大部分编译器都会这么做

 

由于空基类优化技术节省了对象不必要的空间,提高了运行效率,因此成为某些强大技术的基石,基于类型定义类如stl中的binary_functionunary_functioniteratoriterator_traits的实现复用;基于策略类如内存管理、多线程安全同步的实现复用。当某个类存在空类类型的数据成员时,也可考虑借助EBO优化对象布局.

下列程序输出是什么,为什么?

 

#include   <iostream>

using   namespace  std;

class  EmptyClass1{

};

class  EmptyClass2{

};

class  Derived1: public  EmptyClass1{

private : 

     int  x;

};

class  Derived2: public  EmptyClass1,public  EmptyClass2{

private : 

     int  x;

};

int  main(){

    cout<<  "sizeof(EmptyClass1)= "  <<  sizeof (EmptyClass1) << endl;

    cout<<  "sizeof(Derived1)= "  <<  sizeof (Derived1) << endl;

    cout<<  "sizeof(Derived2)= "  <<  sizeof (Derived2) << endl;

    cin.get();

     return  0;

}

 

 

VS2010

GCC

sizeof(EmptyClass1) = 1

sizeof(Derived1) = 4

sizeof(Derived2) = 8

sizeof(EmptyClass1) = 1

sizeof(Derived1) = 4

sizeof(Derived2) =4

空白基类最优化无法被施加于多重继承上只适合单一继承

 

还需要注意的是:在继承链中,对空基类的优化不能传递到后代

 

 


你可能感兴趣的:(C++空白基类最优化(EBO或EBCO))