Effective C++ Item 39 明智而审慎地使用 private 继承

本文探讨了C++中private继承的意义及其应用场景,并详细解释了empty base optimization(EBO)如何帮助实现对象尺寸最小化的目标。通过示例对比了常规类与采用EBO优化后的类在内存占用上的区别。

本文为senlie原创,转载请保留此地址:http://blog.youkuaiyun.com/zhengsenlie


经验:private 继承意味 is-implemented-in-terms of。它通常比 composition 的级别低。

但是当 derived class 需要访问 protected base class 的成员,或需要重新定义继承而来的 virtual 函数时,这么设计是合理的


经验:和 composition 不同, private 继承可以造成 empty base 最优化。这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要
示例1:虽是 Empty class,但却不仅要花费一个 char 空间,还可能因为对齐的需要而花费更多的空间
class Empty{}; //这种 class 不带任何数据,没有 non-static 成员变量,没有 virtual 函数(因为这种函数的存在会为每个对象带来一个 vptr, Item 7),
			   //也没有 virtual base classes (因为这样的 base classes 也会招致何种上的额外开销, Item 40)

class HoldsAnInt{
private:
	int x;
	Empty e;
};


int main(){
	cout << sizeof(Empty) << " " << sizeof(HoldsAnInt) << endl;//32位机器输出:1 8 
	return 0;
}

解析:
C++会安插一个char到空对象内
对齐:一个类型的大小要能整除其地址值。


示例2:EBO,Empty class 不会花费额外空间
class HoldsAnInt : private Empty{
private:
	int x;
} ;

int main(){
	cout << sizeof(Empty) << " " << sizeof(HoldsAnInt) << endl;//32位机器输出:1 4
	return 0;
}

解析:EBO(empty base optimization;空白基类最优化)。EBO只能用于单继承,不能用在多继承中。
现实中的"empty" classes并不真的是 empty。虽然它们从未拥有 non-static 成员变量,却往往内含 typedefs, enums, static 成员变量,或 non-virtual 函数。
STL就有许多技术用途的 empty classes.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值