Cでは、厳密なエイリアシングを観察する際に生じるパフォーマンスのメリットは何ですか?厳密なエイリアシングのパフォーマンス上のメリット
15
A
答えて
17
エイリアシングを非常に詳しく説明しているページがあります。here
また、いくつかのトピックがありますhereとhere。要約すると、コンパイラは、異なるタイプの2つのポインタが同じ場所にアクセスしている(つまり、毎回値を読み込んで最適化できない)場合、データの値を仮定することはできません。
これは、厳密なエイリアシングが強制されていない場合にのみ発生します。厳密なエイリアシングオプション:
- GCC:-fstrictエイリアシング[デフォルト]と-fno-厳密エイリアシング
- MSVC: 厳密なエイリアシングがデフォルトでオフになっています。 (誰かがそれをオンにする方法を知っている場合は、 そう言ってください。)
例
のmain.cにこのコードをコピー&ペースト:
void f(unsigned u)
{
unsigned short* const bad = (unsigned short*)&u;
}
int main(void)
{
f(5);
return 0;
}
その後これらのオプションを使用してコードをコンパイルします。
gccのmain.cの-Wall -O2
そして、あなたが取得します:
のmain.c:3: を警告:逆参照型punned ポインタが厳しいエイリアシング ルール
を中断しますGCC main.cの-fno-厳密-別名:と
無効エイリアシング -Wall -O2
警告が消えます。 (または、壁を取り出すだけですが、コンパイルしないでコンパイルしないでください)
私はMSVCで警告を受けることができないかもしれません。
関連する問題
- 1. 厳密なエイリアシング規則違反
- 2. 厳密なエイリアシング違反ですか?
- 3. 厳密なエイリアシング例外説明
- 4. データ型の厳密なフィールドのメリット
- 5. STM32 SPIのハードウェアと厳密なエイリアシングの警告
- 6. 厳密なエイリアシングとstd :: arrayとCスタイルの配列
- 7. c - 厳密なエイリアシング警告の処理方法
- 8. g ++の厳密なエイリアシング警告を有効にする
- 9. コンパイル時に「厳密なエイリアシング」を検出する方法は?
- 10. 浮動小数点ビットと厳密なエイリアシング
- 11. 厳密なエイリアシングは矛盾しているようです
- 12. Visual C++は "厳密なエイリアシング"をサポートしていますか?
- 13. 厳密なエイリアシング規則でこれはいいですか?
- 14. このコードは厳密なエイリアシング規則に違反していますか?
- 15. このポインタキャストは厳密なエイリアシング規則を破棄しますか?
- 16. haskellでの厳密なまたは非厳密な乗算?
- 17. PHP7のスカラー型と厳密型はパフォーマンス向上機能ですか?
- 18. テキストフィールドの厳密な検証
- 19. 厳密なヌルチェックのオーバーライド
- 20. Symfonyサービスの厳密なパラメータ
- 21. 厳密モードのないJSON.parse
- 22. Angularjsの厳密なモデル値
- 23. ストライプの厳密なURLバインド
- 24. 厳密なJSONオブジェクトのコンテンツタイプ
- 25. スウィフトの厳密さ
- 26. intとfloatの間の厳密なエイリアシングを破ることの実際の結果
- 27. この厳密なエイリアシングはどのようにして未定義の動作ですか?
- 28. XHTML厳密な検証
- 29. PHPUnit assertEquals厳密な型チェック
- 30. 厳密な等価比較
+1ですが、厳密なエイリアシングが観察されない場合は、コンパイラがその仮定を立てられないことを明確にしてください。 –
パーフェクト! :) MSVC++では厳密なエイリアシングのオプションがないように思います。それには__restrictと__declspec(制限)がありますが、これは個々のケースで使用できます。 –
"-fno-strict-aliasing [デフォルト]と-fno-strict-aliasing"のように見えます。デフォルトでは-fno-strict-aliasingではなく-fstrict-aliasingの (少なくとも最新のGCCでは)どのような場合でも、リストされている2つのGCCオプションのうちの1つは-fstrict-aliasingでなければなりません。そして今は両方とも-fno-strict-aliasingと言います。 – tialaramex