【问题标题】:Size of Class with virtual inheritnce具有虚拟继承的类的大小
【发布时间】:2020-10-31 23:41:03
【问题描述】:

我正在使用https://www.onlinegdb.com/online_c++_compiler 尝试下面的虚拟继承程序..

#include <iostream>

using namespace std;

class ABase{ 
        int iMem; 
}; 
 
class BBase : public virtual ABase { 
        int iMem; 
}; 
 
class CBase : public virtual ABase { 
        int iMem; 
}; 
 
class ABCDerived : public BBase, public CBase { 
        int iMem; 
}; 

int main()
{
    cout << "Int is :" << sizeof(int) <<endl;
    cout << "Abase is :" << sizeof(ABase) << endl;
    cout << "Abase is :" << sizeof(BBase) << endl;
    cout << "Abase is :" << sizeof(CBase) << endl;
    cout << "Abase is :" << sizeof(ABCDerived) << endl;
    return 0;
}

ABase、BBase、CBase 和 ABCDerived 的大小分别为 4、16、16 和 40。

通常从我读到的内容中,我希望 BBase 和 CBase 为 12 个字节(两个 int 变量为 8 个字节,vPtr 为 4 个字节)。但是我得到 16,即使我假设 vPtr 使用 8 字节,ABCDerived 怎么会有 40 字节大小?

OnlineGBD 工具声称使用 G++/C++ 编译器。

我知道以前在这个论坛上也有人问过类似的问题,但我无法理解这个尺寸计算。

【问题讨论】:

  • 一个词:padding.

标签: c++ c++11 g++


【解决方案1】:

如果您使用 #pragma pack(1) 删除填充以减少混淆空间,请考虑:

#include <iostream>

using namespace std;
#pragma pack(1)

class ABase{ 
        int iMem; 
}; 
 
class BBase : public virtual ABase { 
        int iMem; 
}; 
 
class CBase : public virtual ABase { 
        int iMem; 
}; 
 
class ABCDerived : public BBase, public CBase { 
        int iMem; 
}; 

int main()
{
    cout << "void* is :" << sizeof(void*) << endl;
    cout << "Int is :" << sizeof(int) <<endl;
    cout << "Abase is :" << sizeof(ABase) << endl;
    cout << "Bbase is :" << sizeof(BBase) << endl;
    cout << "Cbase is :" << sizeof(CBase) << endl;
    cout << "ABCDerived is :" << sizeof(ABCDerived) << endl;
}

这会给你输出:

void* is :8
Int is :4
Abase is :4
Bbase is :16
Cbase is :16
ABCDerived is :32

BbaseCbase 包含:

  • Abase 虚拟基础(4 字节)
  • 指向其Abase 虚拟基址的指针(8 个字节)
  • 他们自己的int 成员(4 个字节)

总计 = 16 个字节

ABCDerived 包含:

  • Bbase 基数(16 字节)
  • 一个Cbase 基(只需要存储int 成员+ 指向通过Bbase 继承的现有Abase 虚拟基的指针 = 4 + 8 = 12 个字节)
  • 他们自己的int 成员(4 个字节)

总计 = 32 字节

【讨论】:

  • 所以 ABCDerived 将有两个指向 Abase;s 虚拟 Base 的指针(一个通过 BBase,一个通过 CBase)??
  • @ArunKalirajaBaskaran 是的
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2013-02-26
  • 2016-03-04
  • 2012-05-19
  • 2019-12-20
  • 2020-02-01
  • 2021-09-09
相关资源
最近更新 更多