gpt4 book ai didi

编译器可以删除 C++(虚拟)私有(private)基类吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:46 25 4
gpt4 key购买 nike

给定以下示例:

class A
{
protected:
static void useful_function_without_side_effects() {...}
}

class B : private A
{
// B has no friends :(

public:
void travel_back_in_time() { super_useful_function(); }
}

问题 1:是否允许编译器优化基类 A,因为这个基类不能真正影响 B 或其运行时行为以任何方式?

问题 2:如果像这样将继承声明为 private virtual,这会改变吗?

class B : private virtual A

最佳答案

答案1:

非多态类在运行时完全没有代表。唯一可能存在的是对象和方法,它们被视为函数。该类仅指示编译器访问对象的某些部分并按照定义的方式解析方法调用。一旦直接解析,所有内容都将硬编码在运行时代码中。 private 限定词在这里没有任何改变。

B 派生的 A 类(没有字段)不会“增加大小”到 B 类的对象,如果这是你的问题。如果 A 类没有字段,这始终为真,但 sizeof(A) 至少始终为 1。尽管也没有规定 B 的大小必须是所有字段和基类的大小之和。

答案2

这增加了 B 类的大小。该标准没有明确说明是什么方式。在典型的实现中,它总是将 B 类的大小扩展一个指针的大小,加上类 A 的任何可能大小。

通常虚拟继承是通过使用“指向自身的指针”来实现的。也就是说,派生类 (A) 的子对象在物理上是整体对象的一部分,但从不直接访问它,而是通过整体对象中的指针访问。

当你有总大小为 4 的无字段 A 和 B 时,情况更是如此:

物理继承:

B: [A: 0] [B extension: 4]

虚拟继承:

B: [A virtual: <pointer size>] [B extension: 4] [A shared subobject: 1]

这些东西的顺序可能因实现而异,尽管它是 ABI 定义的一部分,而不是编译器的私有(private)规则(也就是说,一个平台上的所有编译器必须使用相同的规则)。

关于编译器可以删除 C++(虚拟)私有(private)基类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29627410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com