【问题标题】:Size of an array inherited virtually from two classes虚拟继承自两个类的数组大小
【发布时间】:2021-09-09 08:07:48
【问题描述】:

考虑以下程序:

#include<iostream>
using namespace std;
  
class base {
  int arr[10];     
};
  
class b1: virtual public base { };
  
class b2: virtual public base { };
  
class derived: public b1, public b2 {};
  
int main(void)
{ 
  cout<<sizeof(derived);
   return 0;
}

据我所知,由于虚拟基类,数组 arr 在类中仅继承一次。因此派生类的 sizeof 应该是 10*4=40 字节。但是,在执行时,该程序将打印 56 作为输出。我什至在编译器上检查了 int 的大小,它只有 4 个字节。有人能解释一下额外的 16 个字节是从哪里来的吗?

【问题讨论】:

标签: c++ virtual sizeof base-class


【解决方案1】:

它可能是用于保存虚函数地址的 v-table 的大小。如果您检查b1b2,它是48 个字节,可能是一个指向v-table 的指针(64 位系统上的指针是8 个字节)。下一次继承也会发生同样的情况,将大小增加 8 倍。

旁注:我认为它是 v-table,因为如果您将代码编译为 32 位程序,大小将增加 4 个字节(32 位系统中的指针)。另外,如果你去掉virtual关键字,大小就不会再增加了,所以很明显是和virtual调用有关的东西,首先想到的是v-table。

【讨论】:

  • 有什么方法可以确认它是否真的是v-table的大小?
  • @loveofprogramming 更新了答案。如果您删除 virtual 关键字,您的大小将不再增加(在 b1b2 的情况下)并且编译 32 位仅增加 4。所以我几乎可以肯定它是与相关的指针的大小virtual 调用,首先需要的是 v-table。
  • 顺便问一下,你是如何使用 32 位编译的?
  • @loveofprogramming 如果您使用 clang 或 gcc,请添加 -m32
  • 没有虚函数,所以没有虚函数表(vtable)。
猜你喜欢
  • 2023-03-22
  • 2020-10-31
  • 2020-02-01
  • 2013-02-26
  • 2019-12-20
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多