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. g ++の厳密なエイリアシング警告を有効にする
- 3. 厳密なエイリアシングとstd :: arrayとCスタイルの配列
- 4. 浮動小数点ビットと厳密なエイリアシング
- 5. 厳密なエイリアシングは矛盾しているようです
- 6. コンパイル時に「厳密なエイリアシング」を検出する方法は?
- 7. このポインタキャストは厳密なエイリアシング規則を破棄しますか?
- 8. テキストフィールドの厳密な検証
- 9. 厳密モードのないJSON.parse
- 10. ストライプの厳密なURLバインド
- 11. PHP7のスカラー型と厳密型はパフォーマンス向上機能ですか?
- 12. XHTML厳密な検証
- 13. MonadFix厳密な言語で
- 14. このインスタンスのarguments.calleeの厳密なモード
- 15. C++の厳密なtypedef用のイディオム
- 16. Haskellの厳密なデータ構造のライブラリ
- 17. PHPでの厳密な比較
- 18. LINQの厳密な型付け
- 19. PFXでの厳密な名前付け
- 20. Xampp localhost厳密な規格のエラー
- 21. ローカルAppFabricとローカルMemcache - 厳密にパフォーマンスを話す
- 22. スフィンクス:非厳密クエリ
- 23. C89またはC++ 03は厳密なエイリアシング規則を定義していますか?
- 24. JS:厳密でないモードで同じ名前の2つ以上のオブジェクトプロパティ?
- 25. 弾性検索厳密なハイライト
- 26. Python厳密に型リスト
- 27. xhtml過渡対厳密?
- 28. IE厳密モードのActiveXコントロールでのフリッカー
- 29. vimの厳密な自動インデントのようなEmacs
- 30. ActionScript 3厳密モードの概要
+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