27

C++11 9.1/7 (ドラフト n3376)によると、標準レイアウトクラスは次のようなクラスです。

  • タイプ非標準レイアウト クラス (またはそのようなタイプの配列) または参照の非静的データ メンバーを持たない、

  • 仮想関数 (10.3) も仮想基本クラス (10.1) もありません。

  • すべての非静的データメンバーに対して同じアクセス制御 (Clause11) を持ち、

  • 非標準レイアウトの基本クラスはありません。

  • 最も派生したクラスに非静的データ メンバーがなく、非静的データ メンバーを持つ基本クラスが最大 1 つあるか、または非静的データ メンバーを持つ基本クラスがない。

  • 最初の非静的データ メンバーと同じ型の基本クラスはありません。

したがって、空のクラスは標準レイアウトクラスです。また、ベースとして空のクラスを持つ別のクラスも、そのようなクラスの最初の非静的データ メンバーがベースと同じ型でない場合、標準レイアウトクラスです。

さらに、9.2/19は次のように述べています。

を使用して適切に変換された標準レイアウト構造体オブジェクトへのポインターは、reinterpret_castその最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。[ 注: したがって、標準レイアウトの構造体オブジェクト内に名前のないパディングがある場合がありますが、適切な配置を実現するために必要なため、先頭にはありません。—終わりのメモ]

これは、少なくとも標準レイアウトクラスでは、空の基本クラスの最適化が必須の最適化であることを意味しているようです。私のポイントは、空のベースの最適化が義務付けられていない場合、標準レイアウトクラスのレイアウトは標準ではなく、実装が最適化を実装するかどうかに依存するということです。私の推論は正しいですか、それとも何かが欠けていますか?

4

1 に答える 1

23

はい、その通りです。「PODの再検討」の提案で指摘されています:http ://www.open-std.org/jtc1/sc22/WG21/docs/papers/2007/n2342.htm#ABI

Embarcaderoコンパイラのドキュメントにも次のように記載されています:http://docwiki.embarcadero.com/RADStudio/en/Is_standard_layout

もう1つの重要なポイントは[class.mem]/16です

2つの標準レイアウト構造体(第9節)タイプは、同じ数の非静的データメンバーがあり、対応する非静的データメンバー(宣言順)がレイアウト互換タイプ(3.9)である場合、レイアウト互換です。

基本クラスではなく、データメンバーのみがレイアウトの互換性に影響するため、これら2つの標準レイアウトクラスはレイアウト互換であることに注意してください。

struct empty { };
struct stdlayout1 : empty { int i; };

struct stdlayout2 { int j; };
于 2012-05-28T19:42:57.883 に答える