vyy*_*yyd 5 c++ layout inheritance struct padding
这是我的代码
#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
}
Run Code Online (Sandbox Code Playgroud)
为什么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]
Run Code Online (Sandbox Code Playgroud)
在这种struct情况下考虑这个程序:
void f(C& cx)
{
cx.c = 'x';
}
int main()
{
D d{};
d.D::val = 'y';
f(d);
std::cout << d.D::val << '\n';
}
Run Code Online (Sandbox Code Playgroud)
此代码必须输出y.
在您的系统上,A和C结构的大小为 ,8因为有一个具有大小4和字符的成员,并且该结构必须与其最大成员正确对齐。这些结构有 4 个字节的 int、1 个字节的 char 和 3 个填充字节。
cx.c = 5;允许赋值修改填充(任何结构赋值都可以修改结构填充)。因此,填充不能用于存储基类元素。
然而,没有类似的例子是可能的A,B因为 的数据成员A是私有的。不可能有一个函数,void f(A& ax) { ax.c = 'x'; }所以这个问题不会出现,编译器可以使用 的填充区域A来存储派生类成员。
注意:这两个类都不是标准布局,因为在基类和派生类中都有数据成员。
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |