web-dev-qa-db-ja.com

g ++で静的ライブラリを作成するための最適化とフラグ

Linuxのg ++​​コンパイラーから始めたところですが、コンパイラーフラグについて質問がありました。ここにいる

最適化

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

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

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

静的ライブラリ

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

30
Navaneeth K N

経験則:

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

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

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

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

41
joshk0

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

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

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

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

6

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

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

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

必要なものを何でも測定して最適化することが最善です。試して、測定し、決定します。

重要な経験則の1つ-C/C++ソースビューは生成されたバイナリから遠ざかるので、コードの最適化が行われるほど、デバッガーを使用したデバッグ(またはその逆アセンブリの読み取り)が難しくなります。この理由で開発/デバッグするときは、より少ない最適化で作業することをお勧めします。

4
Hexagon

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

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

2
Tal Pressman

静的ライブラリの質問に関しては、 David Cournapea で与えられる答えは正しいですが、静的ライブラリファイルでranlibを実行する代わりに、 'ar'で 's'フラグを使用することもできます。 'ar'マニュアルページ

アーカイブでarを実行することは、アーカイブでranlibを実行することと同等です。

どちらの方法を使用するかは、個人的な好みの問題です。

0
badPhysicist