時々、C++コンパイラは同じバイナリ内の同じタイプTに対して異なるメモリレイアウトを生成します。すなわち、オブジェクトは、クラスの非連続サブオブジェクトとして、スタンドアロンオブジェクト又はアレイサブオブジェクトの両方として発生したときにこれが起こる:同じバイナリで同じタイプの異なるレイアウト
struct A { int i; };
struct B : virtual A { int i; };
struct C : virtual A { int i; };
struct D : B,C { int i; };
...
D d;
B b;
B* p1= &(B&)d;
B* p2= &b;
C++ 14標準によれば、任意のものを生成するフリーのコンパイラであります1つのバイナリ内にタイプTのオブジェクトの異なるレイアウトの数? メモリレイアウトはコンパイル時に固定されていますか?
スピン・オフ:2番目の質問にHow does placement new know which layout to create?
詳細説明: 型TのオブジェクトtはT *でまたはchar *ポインタのいずれかによってアクセスすることができます。 (後者は3.10(10)によって正当化される)コンパイルされたプログラムが実行されると、一方はチャーポインタを介してTにアクセスすることにより、Tのサブオブジェクトの相対オフセットを決定してもよいです。これらのオフセットは決定的なものか、あるプログラムの実行から別のプログラムの実行に変わることがありますか?
ご質問を詳しくお答えください。 *メモリレイアウトはコンパイル時に固定されていますか? –