データのパック方法が標準で指定されていないことは知っています。私はクラスのメモリレイアウトについてのアイデアを得ようとしていました(特にdynamic_cast<void*>
、最も派生したクラスの先頭へのポインターを返すことを保証する方法)。次のコードの出力についての説明は思いつきませんでした:
struct A{ int a;};
struct B{ int b;};
struct C: public A, public B { int c;};
struct D:public C {int d;};
int main(){
D* ob=new D;
A* a = ob;
B* b = ob;
C* c = ob;
}
ポインターの値を出力すると、a
、c
、d
が常に同じ値を持ち、b
オフセットとして 4 バイトが追加されるだけであることがわかります。偶然ですか?それともその背後にロジックがありますか?
編集:
概念的にはレイアウトは画像のようにする必要がありますが、どういうわけかポイントA、C、Dが1つにマージされます。