C++11 9.1/7 (ドラフト n3376)によると、標準レイアウトクラスは次のようなクラスです。
タイプ非標準レイアウト クラス (またはそのようなタイプの配列) または参照の非静的データ メンバーを持たない、
仮想関数 (10.3) も仮想基本クラス (10.1) もありません。
すべての非静的データメンバーに対して同じアクセス制御 (Clause11) を持ち、
非標準レイアウトの基本クラスはありません。
最も派生したクラスに非静的データ メンバーがなく、非静的データ メンバーを持つ基本クラスが最大 1 つあるか、または非静的データ メンバーを持つ基本クラスがない。
最初の非静的データ メンバーと同じ型の基本クラスはありません。
したがって、空のクラスは標準レイアウトクラスです。また、ベースとして空のクラスを持つ別のクラスも、そのようなクラスの最初の非静的データ メンバーがベースと同じ型でない場合、標準レイアウトクラスです。
さらに、9.2/19は次のように述べています。
を使用して適切に変換された標準レイアウト構造体オブジェクトへのポインターは、
reinterpret_cast
その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。[ 注: したがって、標準レイアウトの構造体オブジェクト内に名前のないパディングがある場合がありますが、適切な配置を実現するために必要なため、先頭にはありません。—終わりのメモ]
これは、少なくとも標準レイアウトクラスでは、空の基本クラスの最適化が必須の最適化であることを意味しているようです。私のポイントは、空のベースの最適化が義務付けられていない場合、標準レイアウトクラスのレイアウトは標準ではなく、実装が最適化を実装するかどうかに依存するということです。私の推論は正しいですか、それとも何かが欠けていますか?