gpt4 book ai didi

c++ - 具有虚拟继承的类的大小

转载 作者:行者123 更新时间:2023-12-02 10:13:05 25 4
gpt4 key购买 nike

我正在尝试使用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++编译器。
我知道以前在此论坛中曾问过类似的问题,但我无法理解此大小的计算。

最佳答案

如果您使用#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成员+一个指向通过Abase = 4 + 8 = 12字节继承的现有Bbase虚拟基础的指针)
  • 自己的int成员(4个字节)

  • 总计= 32字节

    关于c++ - 具有虚拟继承的类的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62847697/

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