#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.中可复制
*** 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的构造仪,编译器现在可以随意应用所有类型的优化。