我正在阅读有关空基优化(EBO)的内容。阅读过程中,我的脑海中浮现出以下问题:
-
使用空类作为基类有什么意义它对派生类没有任何贡献(无论是功能方面还是数据方面)?
-
In ,我读到了这个:
//S为空
类结构 T : S
{
整数x;
};
[...]
请注意,我们没有丢失任何数据或
代码准确性:当您创建
S 类型的独立对象,
对象的大小仍然是 1(或更大)
前;仅当 S 为基时
另一个类的类执行其内存操作
足迹缩小到零。意识到
想象一下这种节省的影响
包含 125,000 个的向量
对象。仅 EBO 就节省了一半
兆字节内存!
这是否意味着如果我们不使用“S”作为“T”的基类,我们会一定消耗双兆字节内存?我认为,这篇文章比较了两种不同的场景,我认为这是不正确的。
我想知道一个真实的场景,当EBO被证明是有用的。(意味着,在同样的场景中,我们会一定如果我们不使用 EBO 就会损失惨重!)。
请注意,如果您的答案包含如下解释:
重点是空类具有非零大小,但是当派生或派生时它可以具有零大小,那么我就不会问这个,因为我已经知道了。我的问题是,为什么有人首先会从空类中派生出他的类?即使他没有推导并简单地编写了他的类(没有任何空基),他是否有任何损失?
EBO 在以下背景下很重要基于策略的设计 http://en.wikipedia.org/wiki/Policy-based_design,你通常继承的地方私下里来自多个策略类别。如果我们以线程安全策略为例,我们可以想象伪代码:
class MTSafePolicy
{
public:
void lock() { mutex_.lock(); }
void unlock() { mutex_.unlock(); }
private:
Mutex mutex_;
};
class MTUnsafePolicy
{
public:
void lock() { /* no-op */ }
void unlock() { /* no-op */ }
};
给定一个基于策略的设计类,例如:
template<class ThreadSafetyPolicy>
class Test : ThreadSafetyPolicy
{
/* ... */
};
使用该类MTUnsafePolicy
只需不增加类的大小开销Test
: 这是一个完美的例子不用为不使用的东西付费.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)