Я читал, что если вы объявите две структуры, подобные этой:
struct Node {
int a, b, c;
};
struct DerivedNode {
struct Node base;
int d, e, f;
};
Тогда вы можете использовать указатели на них следующим образом:
struct DerivedNode myDerivedNode;
struct Node *regularNode = (struct Node *) &myDerivedNode;
regularNode->a = 3;
Другими словами, смещения адресов для a, b, c
одинаковы в пределах struct Node
и struct DerivedNode
. Таким образом, вы можете извлечь из него своего рода полиморфизм, при котором вы можете принудительно передать указатель DerivedNode (struct Node *)
-cast везде, где обычно берется указатель Node.
Мой вопрос: гарантировано ли это поведение? Я знаю, что есть некоторые странные проблемы с выравниванием памяти, и что компилятор иногда переупорядочивает поля для лучшей упаковки в памяти. Будет ли когда-нибудь располагаться поле base
, кроме начала struct DerivedNode
?