私の知る限り、厳密なエイリアシングを検出するプリプロセッサディレクティブはありません。
gccの "-Wall"を使用している場合、コンパイラは厳密なエイリアシング規則を破る可能性のあるコードについて警告します。
-Wstrict-aliasing
「-fstrictエイリアシングが」アクティブ あるとき---このオプションはアクティブです。 がコンパイラが の最適化に使用している厳密なエイリアス規則 を壊す可能性があるコードについて警告します。警告は すべてのケースをキャッチしませんが、 より一般的な落とし穴をキャッチしようとします。 '-Wall'には が含まれています。あなたが作業しているコードは、あなたがgccので-fstring-aliasing
を無効にすることができます重要な場合それは-Wstrictエイリアシング= 3 '
に 同等です。または、厳密なエイリアシングを無効にしたくない場合は、コンパイラが望ましくない危険な最適化を行っていないことを確認するために、asm出力を調べることをお勧めします。余談として
、akauppiコメントで述べている:
厳密エイリアシングを特定ポインタのため 最適化を可能にする '制限'。
restrictキーワードでは「有効にしません...直接の最適化」のではなく、それが特定の最適化技術を適用することができる場合、コンパイラが判断するのに役立ちます間接的にコンパイラに詳細な情報とは、余分な情報を提供します
TI's DSP compiler documentationからrestrictキーワードの良い説明:。
コンパイラを助けるためにメモリの依存関係を判断するには、 ポインタ、参照、または配列をrestrictキーワードで修飾することができます。restrictキーワードは ポインタ、参照、および配列に適用できる型修飾子です は、ポインタの範囲内 宣言は、指し示すことができるオブジェクトをaccそのポインタによってのみエッセードされます。 この保証の違反は、プログラムを未定義にします。この方法は、 のエイリアシング情報 をより簡単に特定できるので、コンパイラがコードの特定のセクションを最適化するのに役立ちます。
これは間違っています。 CとC++は同じ型の変数間でエイリアシングを許しますが、CやC++では異なる型のエイリアシングを許可しません(GCCの厳密なエイリアシングの最適化)。 – janneb
.. charを除く、もちろん – janneb