【发布时间】:2019-08-17 04:59:07
【问题描述】:
我试图弄清楚在继承的情况下类对齐是如何工作的。目前我明白了
- 该类将具有其最宽成员的对齐方式
- 类的末尾可以根据其对齐方式进行填充,以防它位于数组中
- 结构成员根据结构对齐方式对齐
例如:
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 对齐。
它是继承层次结构中最广泛的类吗?
【问题讨论】:
-
我不确定这里有什么保证。我认为这是“定义的实现”,但我不太确定。
-
"...每个直接和间接基类都作为基类子对象存在于派生类的对象表示中,位于 implementation-defined 偏移处。 ..." 来源:en.cppreference.com/w/cpp/language/derived_class