继承成员的私有属性会影响班级的整体规模吗?

问题描述 投票:0回答:1
在下面运行此代码,基类的大小和派生类都是32。

#include "iostream" #include "string" using namespace std; class base{ //public: int a; double b; void * c; char d; }; class c1 : base{ //public: int a; }; int main() { cout << sizeof(base) << endl; cout << sizeof(c1) << endl; return 0; }

,但是,如果您撤消关键字的注释
public:

-Xclang -fdump-record-layouts
sizeof carders class将变为40.

我在这里完全迷失了,为什么会员变量是私人的或不影响整体规模?

在gcc.

中可复制

c++ inheritance public private-members memory-layout
1个回答
1
投票
如果您使用的是clang,则可以添加

*** Dumping AST Record Layout 0 | class base 0 | int a 8 | double b 16 | void * c 24 | char d | [sizeof=32, dsize=32, align=8, | nvsize=32, nvalign=8]

来查看实际布局编译器为您制作。
如果您在公共基类公开中进行会员变量,则显示出如下所示的布局:

int a

,您可以看到dsize和nvsize都已经采用了32个字节。从派生类中没有合并的余地,即您的代码中的C1。
编译器的理由归结为this Abi规范


IFC是一个POD,但不是出于布局目的而不是POD,请设置DSize(C)= nvsize(c)= sizeof(c)

足够有趣的事实是,通过在您的基类中添加一个虚拟构造函数,sizeof(base)将为32,因为您有效地使基地成为非pod的构造仪,编译器现在可以随意应用所有类型的优化。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.