【发布时间】:2011-05-18 12:44:02
【问题描述】:
我正在阅读有关空基优化 (EBO) 的信息。在阅读的过程中,我的脑海中突然出现了以下问题:
-
对派生类没有任何贡献(无论是功能方面还是数据方面),使用 Empty 类作为基类有什么意义?
-
在this article,我读到了这个:
//S 为空
类结构 T : S
{
整数 x;
};[...]
请注意,我们没有丢失任何数据或 代码准确性:当您创建一个 S 类型的独立对象, 对象的大小仍为 1(或更多)为 前;仅当 S 用作基础时 另一个类的类做它的记忆 足迹缩小到零。意识到 这种节省的影响,想象一下 包含 125,000 个的向量 对象。 仅 EBO 就节省了一半 兆字节的内存!
这是否意味着如果我们不使用“S”作为“T”的基类,我们将必然消耗两倍兆字节的内存?我认为,这篇文章比较了两种我认为不正确的不同场景。
我想知道当 EBO 被证明有用时的真实场景。(意味着,在同样的场景中,如果我们不使用 EBO,我们必然会不知所措!)。
请注意,如果您的回答包含这样的解释:
重点是一个空类的大小不为零,但是当派生或派生它时,它的大小可以为零,那么我不是在问这个,因为我已经知道了。我的问题是,为什么有人首先会从一个空类中派生出他的类? 即使他没有派生而只是编写他的类(没有任何空基),他是否会不知所措?
【问题讨论】:
-
@Suma...你在我的帖子中做了什么改变? :-/.. 我想不通..
-
为什么说基类在功能方面没有任何贡献?
-
@jalf .... 到目前为止我还没有看到任何示例.. 顺便说一下,我所说的功能是指做某事而不是什么都不做的函数
-
@Nawaz:但是为什么基类函数不能做“做某事”呢?
-
空类并不意味着没有“成员”,而是意味着“没有数据成员”。它仍然可以有“功能成员”。因此,您可能需要该功能,而重用该功能的最简单方法是通过组合。但是,如果您怀疑对象可能没有数据成员,您可能更愿意为此类类型私有继承以减少派生类的内存占用。这不是关于“我会从 A 继承,因为它对 A 有好处”,而是“我更喜欢继承而不是组合以从 EBO 中受益,因为无论如何我都需要 B 中的对象 A”。
标签: c++ class optimization memory-management compiler-optimization