C++空类,空虚基类处理及类大小

对于一个空类,编译器会加入1byte的大小,使得这一个类的两个对象在内存中有独一无二的地址。

如下一个类关系:

代码如下:

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

每个类的大小:

传统编译器对empty virutal base class的处理是放在继承类的尾部,那么以上大小

X : 编译器插入1byte 。为1

Y(Z):编译器添加一个指向虚基类子对象的指针或者一个相关的表格,所以是 4 byte; 但是在加上X的大小,4+1=5,在按照对齐,对齐是按照4bytes对齐,最终是5+3=8;

A:不是Y+Z=16,因为虚基类子对象在继承类中只存在一份实例,而且不管是继承多少次,所以是一份X:1, Y+Z = 4+4 = 8; 对齐之后1+8+3 = 12 bytes

但是新进的编译器(Visual C++和gcc都是这种情况,所以觉得应该慢慢都会这样),对于empty virtual base class进行了特殊处理,这个类被视为继承类对象的最开头的一部分,所以它没有花费任何空间,也就节省了上面的1byte,同时也节省了Y Z的3bytes对齐。

所以每个大小

X:1

Y(Z):虚基类在最顶部,不占空间,4

A:4+4 = 8

课件节省了空间。但如果在虚基类当中放置一个以上的数据成员,则两种编译器会产生完全相同的布局。

C++对象模型中,将非静态数据成员,不管是自己的还是继承的直接放在类的每个对象中;对于静态成员,则放置在一个全局数据段中,不会影响个别类的大小,且每个类只存在一份实例,及时类没有对象,也有静态成员。但是一个模板类的静态成员行为可能不同。

每个类对象的大小包括非静态成员,编译器会加上一些成员(支持各种virtual特性),然后是一些对齐。这三部分得出对象的size.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值