Empty Class 的大小——《Inside The C++ Object Model》之一

在C++中,一个空类的大小到底是多少呢?当你定义如下的一个类X时,你设想它的大小是多少?

class X {};

X的大小是0吗?请看下面的代码

#include <iostream>
using namespace std;

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

int main()
{
	cout<<"size of X: "<<sizeof(X)<<endl;
	cout<<"size of Y: "<<sizeof(Y)<<endl;
	cout<<"size of Z: "<<sizeof(Z)<<endl;
	cout<<"size of A: "<<sizeof(A)<<endl;

	return 0;
}

以上代码在VC6.0的运行结果如下:

 size of X: 1
 size of Y: 4
 size of Z: 4
 size of A: 8

为什么一个空的类X会有占据1byte的内存空间呢?《Inside The C++ Object Model》给出了解释。

  • 实际上一个空的类并不是空的,它有一个隐晦的1byte,那是被编译器安插进去的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址,对两个不同的object加以区分。
  • 在一些编译器的实现中,类似Y和Z这种情况,它们的大小将有可能是8bytes,其中包括从X继承来的1byte,指向虚基类的指针4bytes(32位系统),即Y和Z的大小是 1+4 = 5 bytes,由于编译器对内存边界对齐的要求,5bytes实际上会被调整为 8 bytes (32位系统)。
  • 在其他编译器上,这种对于空类的虚继承会有特殊的优化处理。即子类只包含一个指向虚基类的指针,占用 4bytes,而不会从虚基类中继承额外的1byte,这也是VC6处理的方式,因此,在本例中,class Y和Z的大小都是4bytes。
  • class A继承了Y 和 Z的各自4bytes,因此在VC6环境下,最后的结果是4+4 = 8 bytes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值