29

Linux で g++ コンパイラを使い始めたばかりで、コンパイラ フラグについていくつか質問があります。ここにある

最適化

最適化フラグについて-O1-O2および-O3g++ マニュアルページを読みました。これらのフラグをいつ使用するかがわかりませんでした。通常、どの最適化レベルを使用しますか? g++ のマニュアルには、 について次のように書かれています-O2

さらに最適化します。GCC は、容量と速度のトレードオフを含まない、サポートされているほぼすべての最適化を実行します。-O2 を指定すると、コンパイラはループ展開または関数インライン化を実行しません。-O と比較して、このオプションはコンパイル時間と生成されたコードのパフォーマンスの両方を向上させます。

インライン展開とループ展開を行っていない場合、パフォーマンスがどのように達成され、このオプションは推奨されますか?

静的ライブラリ

g++ を使用して静的ライブラリを作成するにはどうすればよいですか? Visual Studio で、クラス ライブラリ プロジェクトを選択すると、「lib」ファイルにコンパイルされます。g ++で同等のものは何ですか?

4

5 に答える 5

40

経験則:

デバッグが必要な場合は、-O0 (および -g を使用してデバッグ シンボルを生成します) を使用します。

出荷の準備をするときは、-O2 を使用します。

gentoo を使用する場合は、-O3... を使用してください。

組み込みシステムに配置する必要がある場合は、-Os を使用します (効率ではなくサイズを最適化します)。

于 2009-04-28T05:14:38.337 に答える
6

gcc マニュアルには、すべての最適化レベルごとにすべての暗黙のオプションがリストされています。O2 では、コードに応じて、アプリケーションの速度を大幅に変更できる定数フォールディング、分岐予測、co などを取得します。正確なオプションはバージョンに依存しますが、非常に詳細に文書化されています。

静的ライブラリを構築するには、次のように ar を使用します。

ar rc libfoo.a foo.o foo2.o ....
ranlib libfoo.a

Ranlib は必ずしも必要ではありませんが、使用しない理由はありません。

于 2009-04-28T13:43:52.293 に答える
4

どの最適化オプションをいつ使用するかについて - 単一の正解はありません。

特定の最適化レベルでは、パフォーマンスが低下する場合があります。これは、記述しているコードの種類とその実行パターンに依存し、実行している特定の CPU に依存します。

(単純な標準的な例を挙げると、コンパイラーは、コードを以前よりもわずかに大きくする最適化を使用することを決定する場合があります。これにより、コードの特定の部分が命令キャッシュに収まらなくなり、その時点でさらに多くのアクセスが発生する可能性があります。メモリが必要になります - たとえば、ループで)。

必要なものを測定して最適化するのが最善です。試して、測って、決める。

1 つの重要な経験則 - コードに対して実行される最適化が増えるほど、デバッガーを使用してデバッグする (またはその逆アセンブリを読み取る) ことが難しくなります。これは、C/C++ ソース ビューが生成されたバイナリから離れてしまうためです。このため、開発/デバッグ時には最適化を少なくして作業するのが経験則です。

于 2009-04-28T05:06:42.583 に答える
2

ループの展開とインライン化以外に、コンパイラーが実行できる多くの最適化があります。ループの展開とインライン化は、コードを高速化するものの、コードを大きくするため、ここで具体的に言及されています。

静的ライブラリを作成するには、「g ++ -c」を使用して.oファイルを生成し、「ar」を使用してそれらをライブラリにアーカイブします。

于 2009-04-28T04:10:00.210 に答える