Empty virtual base class的内存分配

class X{};
class Y:public virtual X{};
class Z:public virtual X{};
class A:public Y,public Z{};

使用sizeof在vs210上计算上面类的大小,计算结果如下

  

可以看到empty virtual base class的大小并不是0,编译器会安插一个char,这样可以让两个object在内存中有独一无二的地址

X a,b;
if(&a == &b)
    cerr<<"Memery address is same!"<<endl;

class Y 和 class Z的大小是4,这是因为这两个函数虚继承了class X,virtual base class 被放在derived class object 开头的部分,又由于内存对其原则,自动补充了3bytes,所以大小是4。

Empty virtual base class 已经成为C++ OO设计的一个特有技术术语,它提供了一个virtual interface,没有定义任何数据。某些新的编译器对此提供了特殊处理,一个empty virtual base class被视为derived class object最开头的一部分。

class X,Y,Z在内存中的布局如下图所示:

posted @ 2014-10-11 16:11  践行者123  阅读(287)  评论(0编辑  收藏  举报