1

複数のプラットフォーム用のソフトウェアを開発する人にとって、コンパイラーが他のコンパイラーよりも特定のことをうまく行う可能性をどのように処理しますか。

OS X、Windows、Linux用に開発し、Clang / LLVM、VS、GCCを使用しているとします。

したがって、誰かがOS Xでアプリをコンパイルし、GCCを使用していて、別の人がIntelコンパイラを使用してOS Xでコンパイルしている場合、その人が持っていれば、Intelコンパイラのコードのセクションを最適化できます。

プリプロセッサディレクティブをチェックしますか?

#ifdef __GCC_
    // do it this way
#endif

#ifdef __INTEL__
    // do it this way
#endif

#ifdef __GCC_WITH C++_V11_Support__
    // do it this way
#endif

#idfef __WINDOWS_VISUAL_STUDIO
    // do it this way
#endif

それとももっと良い方法はありますか?

コンパイラがコンパイラのバージョンなどをチェックするために提供するディレクティブのリストをどのように見つけるのですか?

4

3 に答える 3

6

事前定義されたマクロに基づいて実装を選択しないでください。ビルドシステムに制御させます。

これにより、単体テスト中に複数の実装を構築して相互に比較できます。

于 2013-03-21T21:36:09.563 に答える
3

通常、最適化は、「コードの20%は実行に80%の時間がかかる」(および「コードの20%は開発に80%の時間がかかる」)という従来の80/20または90/10ルールに従います。必要に応じて、90/10を80/20に置き換えてください。ほとんどの場合、これら2つの間のどこかにあります...

したがって、「特定のコンパイラ用に最適化するか」の最初の段階は、コードのどの部分が遅いかを把握することです。すべてのコンパイラで機能する一般的な方法でコードを改善できるかどうか(たとえば、const参照を渡すなど)大きなオブジェクトのコピーよりも)。コードの一般的な改善をすべて使い果たしたら、コンパイラ固有の最適化を検討することをお勧めしますが、実際には、コンパイラごとに異なるコードを追加してメンテナンスするだけの価値があるほど十分に得る必要があります。

一般的に、私は「コンパイラによって物事が異なる」ことを非常に避けたいと思います。

于 2013-03-21T21:35:45.327 に答える
0

一般的に、コンパイラーは、コンパイラー専用に作成されたものではなく、一般的なコードを最適化するように作成されています。したがって、一般的には、最速のアルゴリズムを使用して、クリーンなコードを書くことに集中する必要があります。ただし、gccなどの一部のコンパイラは、これらの属性を使用する属性を介してヒントを得ることができるため、コンパイラはより適切に機能します。

たとえば、noreturn属性を使用すると、gccは関数の戻りコードを破棄できるため、コードサイズを最小限に抑えることができます。多くのコンパイラが同様のヒントスキームを持っていると思います。

そうすればできます。

#ifdef GCC
     #define NO_RETURN __attribute(...)
#else
     #define NO_RETURN
#endif

そして、コードでNO_RETURNを使用します。

于 2013-03-21T21:33:22.467 に答える