我正在尝试理解继承中的类对齐方式。目前我了解到:
- 类的对齐方式取决于最宽的成员变量
- 如果类是数组的一部分,那么其末尾可以根据对齐方式进行填充
- 结构体成员变量的对齐方式遵循结构体的对齐方式
举个例子:
struct Nested { // Due to the long long element it is 8 aligned
short int ShortNestedElement; //6 bytes of padding here
long long int LongNestedElement;
};
struct Example {
short int ExampleMember_1; // 6 bytes of padding here
Nested ExampleMember_2;
char ExampleMember_2; // 7 bytes of padding here
};
我在继承方面感到困惑:
struct Base1 {
short unsigned int Base_1Member_1;
long unsigned int Base_1Member_2;
};
struct Base2 {
unsigned int Base_2Member_1;
};
struct Base4 {
unsigned int Base_4Member_1;
};
struct Base3 : Base4 {
long unsigned int Base_3Member_1;
};
struct Final: Base1, Base2, Base3 {
};
根据clang,类Final的布局为:
*** Dumping AST Record Layout
0 | struct Final
0 | struct Base1 (base)
0 | unsigned short Base_1Member_1
8 | unsigned long Base_1Member_2
16 | struct Base2 (base)
16 | unsigned int Base_2Member_1
24 | struct Base3 (base) --------> ?
24 | struct Base4 (base)
24 | unsigned int Base_4Member_1
32 | unsigned long Base_3Member_1
| [sizeof=40, dsize=40, align=8,
| nvsize=40, nvalign=8]
我不明白为什么在考虑Base3继承自Base4时(因此Base4的成员出现在Base3之前),我们会考虑Base3(8字节)的对齐而不是Base4(4字节)的对齐。但是,如果我更改这两个类的内容,使Base3对齐到4并且Base4对齐到8,则它将采用Base4的对齐方式。
是以继承层次结构中最宽的类为准吗?