c++ - 虚拟继承会增加派生类的大小吗?

标签 c++ size virtual-inheritance

<分区>

Possible Duplicate:
object size with virtual

虚继承会改变派生类的大小吗?我执行了以下代码,其中我有两个派生类,一个是虚拟继承的,另一个是非虚​​拟继承的:

class A {
 public:
int a;
  virtual void a1();
};


class non_vir_der: public A{
 public:
int c;
  virtual void aa();
};


class vir_der: public virtual A{
public:
int d;
virtual void bb();
};

int main()
{
cout<<sizeof(non_vir_der)<<"\n";
cout<<sizeof(vir_der)<<"\n";
return 0;
}

输出:

12 (imo: 4(int a)+ 4(int c)+ 4(vir ptr))

16(额外 4 个?)

为了再次检查我是否遗漏了什么,我尝试了所需的最少代码,删除了类中的所有整数,输出为:

4

4

第二个输出表明两个派生类的大小相同。 为什么第一次运行vir_der的大小是16,为什么不是12?

最佳答案

此行为完全是特定于实现的,无法保证会发生什么。也就是说,大多数编译器通过在周围放置基类的单个拷贝来实现虚拟继承,然后让派生类的每个实例在其类主体中存储一个指向该唯一实例的指针。这样,如果您将对象转换为它的虚基,编译器就可以发出代码来找出该对象的位置。在 32 位系统上,这意味着虚拟继承可能会将对象的大小增加四个字节,正如您所观察到的那样。

那么为什么没有数据成员就没有区别呢?我不确定,但我猜这是因为编译器足够聪明,可以意识到如果你有一个没有数据成员的虚拟基类,你实际上不需要访问其中包含的任何内容。因此,可以通过消除指向虚基的额外指针来优化对象,因为永远没有办法访问它。不过,我可能错了。

希望这对您有所帮助!

关于c++ - 虚拟继承会增加派生类的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043099/

相关文章:

c++ - 多重继承和不可访问的默认构造函数

C++ 链接时对基类函数的 undefined reference (--不是--vtables、构造函数、模板或纯虚函数)

opencv - 具有不对称圆网格的正方形大小openCV

java - 在 JTabbedPane 中设置选项卡的大小

c++ - websocket++ 使用 fastcgi++ 的 session 示例

c++ - static_cast 如何与虚拟继承一起使用?

c++ - 如何使用变量模板比较C++ 17中的变量类型?

c++ - 有没有在boost 1.48.0下使用mutex的最新例子?

c++ - 在 Ubuntu 上使用 GLFW 设置 OpenGL NetBeans 项目

java - 如何规避字符串大小限制?