【发布时间】:2020-08-14 07:59:18
【问题描述】:
这是我的代码
#include <bits/stdc++.h>
class A{
int val;
char c;
};
class B:public A{
char val;
};
struct C{
int val;
char c;
};
struct D:public C{
char val;
};
int main()
{
std::cout<<sizeof(B)<<std::endl; //8
std::cout<<sizeof(D)<<std::endl; //12
}
为什么class 与struct 有不同的对齐方式
*** Dumping AST Record Layout
0 | class A
0 | int val
4 | char c
| [sizeof=8, dsize=5, align=4
| nvsize=5, nvalign=4]
*** Dumping AST Record Layout
0 | class B
0 | class A (base)
0 | int val
4 | char c
5 | char val
| [sizeof=8, dsize=6, align=4
| nvsize=6, nvalign=4]
*** Dumping AST Record Layout
0 | struct C
0 | int val
4 | char c
| [sizeof=8, dsize=8, align=4
| nvsize=8, nvalign=4]
*** Dumping AST Record Layout
0 | struct D
0 | struct C (base)
0 | int val
4 | char c
8 | char val
| [sizeof=12, dsize=9, align=4
| nvsize=9, nvalign=4]
【问题讨论】:
-
欢迎来到 stackoverflow.com。请花点时间阅读the help pages,尤其是名为"What topics can I ask about here?" 和"What types of questions should I avoid asking?" 的部分。另请参阅tour 并阅读How to Ask,以及this question checklist。
-
在不相关的注释上,请阅读Why should I not #include <bits/stdc++.h>?
-
您可能应该指定您的编译器和平台,因为 C++ 仅对可能的结果指定了一些限制,但确切的结果由目标 ABI 定义。
-
如果您没有为同一结构的不同数据成员使用相同的名称
val,这将不会那么混乱,请更改并更新问题 -
您能否尝试将您的
class成员设置为public,然后打印出大小。
标签: c++ inheritance layout struct padding