gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:29:22 28 4
gpt4 key购买 nike

#include<iostream>

using namespace std;

class abc
{
int a;
};
class xyz : public virtual abc
{
int b;
};

int main()
{
abc obj;
xyz obj1;
cout<<endl<<sizeof(obj);
cout<<endl<<sizeof(obj1);
return 0;
}

答案将取决于编译器,但当我看到这个结果时,我感到很惊讶
~/Documents/workspace/tmp ‹.rvm-›  $ ./class_sizes   

4
16

如果我删除 virtual 关键字,则分配的大小分别为 4 和 8,这正是我所期望的。

为什么会正好占用额外的空间?
我怀疑它是用于 vptr 表或类似的东西,但不确定。

最佳答案

一篇关于 GCC 中虚拟和多重继承的好文章是这篇 (Internet Archive Permalink) :

http://phpcompiler.org/articles/virtualinheritance.html

然而,它并不能完全回答您的问题,因为您从正在使用的任何(未指定的)编译器和build设置中获得了 20 个字节的输出。

如果您使用 GCC(至少在 IDEone 使用的默认设置下),那么您将获得 12 个字节。这与您编写的内容相同:

class abc
{
int a;
virtual void foo() {}
};
class xyz : public abc
{
int b;
};

当 abc 包含虚拟方法时,您是否虚拟地从 abc 继承:
class abc
{
int a;
virtual void foo() {}
};
class xyz : virtual public abc
{
int b;
};

...那么您将从 GCC 中获得 16 个字节。

Why is the extra space being taken up exactly? I suspect it is for the vptr table or something of that sorts but don't know for certain.



如果我不得不对您的 16 字节差异进行疯狂猜测:我可能会调查您的编译器的虚拟继承实现是否将所有虚拟基类都视为具有虚拟方法,即使它们没有?

但我几乎是编造的。如果你想测试这个理论,你必须深入研究;它依赖于实现。

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

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