![]() |
1
1
编译程序 能够 当然,可以有条件地允许零大小的成员对象和基类,但这会更复杂。空基类优化 总是 适用,无论类型如何。每当编译器看到一个类从没有数据成员的类派生时,它就可以使用空的基类优化。 在@konrad rudolphs示例之后,对于成员对象,它必须检查类型,验证该位置是否不存在相同类型的其他对象,以及 然后 也许应用你的优化。除非成员对象位于包含类的末尾。如果是这样,那么对象的“实际”(非零)大小将超出包含类的末尾,这也是一个错误。这在基类的情况下永远不会发生,因为我们知道基类位于派生类的开头,并且派生类的大小为非零。 因此,这样的优化将更加复杂、更加微妙,并且更可能以意想不到的方式中断。 我不能直接引用任何零大小成员对象 一定地 休息一下,但我不相信他们也不存在。我已经指出了一些基本类案例中不存在的限制,而且很可能存在更多的限制。所以问题是,语言应该允许多大的复杂性和不确定性 只是为了使一个很少有用的优化成为可能 ? |
![]() |
2
10
因为同一类型的几个(子)对象可以有相同的地址,这是 被禁止的 根据标准:
这有点合乎逻辑:否则,这两个对象 相同的 对于所有意图和目的(因为对象的标识完全由其类型和内存地址决定),单独声明它们是没有意义的。 |
![]() |
3
2
我认为你的问题是好的——事实上,前面一些关于空基类优化的文章讨论了“空成员优化”,并特别指出类似的优化可以应用于成员。也许,在有标准之前,有些编译器就这样做了。 这只是空谈猜测,我没有太多的支持,但我昨天看了一下这些方面的标准。 C相容性在本例中:
此外,程序似乎假定了一些事情,比如
不能很好地概括为数组继续以上示例,添加以下内容:
…有人可能会想到
比基本情况更不引人注目从空基派生的主要原因之一是它是一个策略或接口类型类。这些代码通常是空的,要求它们占用空间会造成“抽象惩罚”,也就是说,使组织得更好的代码更加膨胀。这是Stroustrup在C++中不需要的——他希望在最小运行时成本下进行适当的抽象。 另一方面,如果声明类型的成员,则不会继承其函数、typedef等;也不会从派生到基进行特殊的指针转换,因此可能没有理由使用零大小的成员而不是零大小的基。 这里的一个反例类似于STL容器中的分配器策略类——您不一定希望容器从中派生,但您希望“保持它在周围”,而不占用开销。 空的基类大小写涵盖了大多数用途…如果担心空间开销,可以使用私有继承而不是声明成员。这不是很直接,但你或多或少也可以实现同样的事情。很明显,如果你有很多空成员,你想占用零空间,这就不太管用了。 这是另一个特例
有很多微妙的事情不适合这种优化。例如,你不能
|
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |