2009-04-07 9 views
2

'Strict aliasing'の最適化では、ソースコードs.aから特別な注意が必要です。ポインタキャストの代わりに共用体を使用します。コンパイラがそのような最適化をしようとしているかどうかをプリプロセッサディレクティブ(#if/else)を使って検出する方法はありますか?コンパイル時に「厳密なエイリアシング」を検出する方法は?

私は気にしないプロセッサーやコンパイラーのために、古い、厳密にエイリアシングのないように準備されたコードパスを維持したいと思います。それはより速く見える。

編集:GCC predefined macrosはエイリアシングについて何も持っていないようです。言い換えれば、私はgcc 4.xに最も興味がありますが、一般的な解決策(存在しないようです)でもあります。

答えて

3

完全に実装に依存する - 特定のコンパイラのドキュメントをチェックする必要があります。このような質問をするときは、使用しているコンパイラについて言及することをお勧めします。

これを行うための半可搬の方法はメイクファイルからです。別名&のエイリアス化されたバージョンの異なるターゲットを定義し、エイリアス化されたバージョンの独自のSTRICT_ALIASING(または何でも)プリプロセッサシンボルを定義します。

1

一般的な解決策はありません。一番近いものは#ifdef __cplusplusです。標準ではC++では、コンパイラは異なる型へのポインタが(char *でない限り)エイリアス化されていないと見なすことができます。これは、単純なシナリオでも同じように起こります。

void (int *foo, float *bar) { 
    *foo++; 
    *bar = 0; // Can safely be scheduled between the load and store of foo. 
} 

したがって、「厳密なエイリアシング」は最適化ではありません。 「未定義の行動を許容する」ことは悲観的なことです。

+2

これは間違っています。 CとC++は同じ型の変数間でエイリアシングを許しますが、CやC++では異なる型のエイリアシングを許可しません(GCCの厳密なエイリアシングの最適化)。 – janneb

+0

.. charを除く、もちろん – janneb

1

私の知る限り、厳密なエイリアシングを検出するプリプロセッサディレクティブはありません。

gccの "-Wall"を使用している場合、コンパイラは厳密なエイリアシング規則を破る可能性のあるコードについて警告します。

-Wstrict-aliasing「-fstrictエイリアシングが」アクティブ あるとき---このオプションはアクティブです。 がコンパイラが の最適化に使用している厳密なエイリアス規則 を壊す可能性があるコードについて警告します。警告は すべてのケースをキャッチしませんが、 より一般的な落とし穴をキャッチしようとします。 '-Wall'には が含まれています。あなたが作業しているコードは、あなたがgccので-fstring-aliasingを無効にすることができます重要な場合それは-Wstrictエイリアシング= 3 '

に 同等です。または、厳密なエイリアシングを無効にしたくない場合は、コンパイラが望ましくない危険な最適化を行っていないことを確認するために、asm出力を調べることをお勧めします。余談として


、akauppiコメントで述べている:

厳密エイリアシングを特定ポインタのため 最適化を可能にする '制限'。

restrictキーワードでは「有効にしません...直接の最適化」のではなく、それが特定の最適化技術を適用することができる場合、コンパイラが判断するのに役立ちます間接的にコンパイラに詳細な情報とは、余分な情報を提供します

TI's DSP compiler documentationからrestrictキーワードの良い説明:。

コンパイラを助けるためにメモリの依存関係を判断するには、 ポインタ、参照、または配列をrestrictキーワードで修飾することができます。restrictキーワードは ポインタ、参照、および配列に適用できる型修飾子です は、ポインタの範囲内 宣言は、指し示すことができるオブジェクトをaccそのポインタによってのみエッセードされます。 この保証の違反は、プログラムを未定義にします。この方法は、 のエイリアシング情報 をより簡単に特定できるので、コンパイラがコードの特定のセクションを最適化するのに役立ちます。

+0

申し訳ありませんが、あなたは間違っています。 'restrict'は、特定のポインタに対する厳密なエイリアシングの最適化を可能にします。その最適化がグローバルに、自動的に_all_ポインタに適用されているかどうかを検出する方法を尋ねました。申し訳ありません、-1。 – akauppi

関連する問題