2

ISO C ++(11)では、非静的クラスのプライベートクラスメンバー変数を最適化できますか?これは検出できます:

class X { int x; };
assert (sizeof(X) >= sizeof(int));

しかし、私は上記の主張を要求する条項を知りません。

明確にするために:(a)上記のアサーションを保証する条項がC++標準にありますか。

(b)xのエリジオンを検出する他の方法を誰かが考えることができますか?[オフセット?]

(c)(a)と(b)にもかかわらず、最適化はとにかく許可されていますか?

クラスが関数に対してローカルである場合は最適化が可能であると感じていますが、そうでない場合は可能ではありません(ただし、明確な引用が必要です)。

4

1 に答える 1

1

禁止ではないと思いますが、非現実的だと思います。

§9 クラス [クラス]

7/標準レイアウト クラスとは、次のクラスです。

  • タイプ非標準レイアウト クラス (またはそのようなタイプの配列) または参照の非静的データ メンバーを持たない、
  • 仮想関数 (10.3) も仮想基本クラス (10.1) もありません。
  • すべての非静的データメンバーに対して同じアクセス制御 (第 11 節) を持ち、
  • 非標準レイアウトの基本クラスはありません。
  • 最も派生したクラスに非静的データ メンバーがなく、非静的データ メンバーを持つ基本クラスが最大 1 つあるか、または非静的データ メンバーを持つ基本クラスがない。
  • 最初の非静的データ メンバーと同じ型の基本クラスはありません。107

8/標準レイアウト構造体structは、 class-keyまたはclass-key で定義された標準レイアウト クラスですclass

... したがってclass X { int x; };、標準レイアウトの構造体です。

§9.2 クラスメンバー [class.mem]

16/ 2 つの標準レイアウト構造体 (条項 9) 型は、同じ数の非静的データ メンバーを持ち、対応する非静的データ メンバー (宣言順) がレイアウト互換型 (3.9) を持っている場合、レイアウト互換性があります。

... したがって、class X { int x; };とのレイアウト互換性がありstruct Y { int y; };ます。

残念なことに、レイアウト互換性は標準で正式に定義されていません。ただし、レイアウトという言葉の使用を考えると、2 つのレイアウト互換型が同じ基本表現を持つ必要があることを宣言することが意図されているようです。

したがって、xin one を削除できるようにするには、レイアウトに互換性のXあるすべての構造( など) が同じ最適化 (レイアウトの互換性を維持するため) に適していることを証明する必要があります。それはかなり... ありそうもない... 重要なプログラムではそうです。Y

于 2012-11-24T16:44:32.257 に答える