C++中空类占一字节原因详解

C++中空类占位问题

    在C++中空类会占一个字节,这是为了让对象的实例能够相互区别。具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。如果没有这一个字节的占位,那么空类就无所谓实例化了,因为实例化的过程就是在内存中分配一块地址。

    注意:当该空白类作为基类时,该类的大小就优化为0了,这就是所谓的空白基类最优化。

#include<iostream>

using namespace std;

class test
{
};

int main()
{
	test a, b;
	cout << "sizeof(test): " << sizeof(test) << endl;
	cout << "addr of a: " << &a << endl;
	cout << "addr of b: " << &b << endl;
	system("pause");
	return 0;
}

如上图所示,这个占位字节仅仅是用来占位。


空白基类最优化:

#include<iostream>

using namespace std;

class test
{
};

class derive :public test
{
	private:
		int a;
};

int main()
{
	test a, b;
	cout << "sizeof(test): " << sizeof(test) << endl;
	cout << "sizeof(derive): " << sizeof(derive) << endl;
	cout << "addr of a: " << &a << endl;
	cout << "addr of b: " << &b << endl;

	system("pause");
	return 0;
}

    在上例中,大部分编译器对于sizeof(derive)的结果是4,而不是8。这就是所谓的空白基类最优化在(empty base optimization-EBO 或 empty base classopimization-EBCO)。在空基类被继承后由于没有任何数据成员,所以子类优化掉基类所占的1 byte。EBO并不是c++标准所规定必须的,但是大部分编译器都会这么做。由于空基类优化技术节省了对象不必要的空间,提高了运行效率,因此成为某些强大技术的基石,基于类型定义类如stl中的binary_function、unary_function、iterator、iterator_traits的实现复用;基于策略类如内存管理、多线程安全同步的实现复用。当某个类存在空类类型的数据成员时,也可考虑借助EBO优化对象布局.

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

多继承:

#include<iostream>

using namespace std;

class test1
{
};

class test2
{
};
class derive1 :public test1
{
	private:
		int a;
};

class derive2 :public test1,public test2
{
	private:
		int b;
};

int main()
{
	cout << "sizeof(test): " << sizeof(test1) << endl;
	cout << "sizeof(derive): " << sizeof(derive1) << endl;
	cout << "sizeof(derive): " << sizeof(derive2) << endl;

	system("pause");
	return 0;
}




  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值