2009-10-08 14 views

答えて

15

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

には「1つのフリーサイズません」があります - あなたは、バイナリの正しいサブセットを決定するために、あなたの要件および最適化フラグを、あなたのアプリケーションを理解する必要があります。

それともあなたが望む答え: -03

+0

私はしたが、まっすぐな説明を見つけることができませんでした。私はちょうど検索で吸うことができます。 – Polaris878

+2

さらに、SOの要点は、Googleのような検索エンジンに表示されることです。 – Polaris878

+0

フェアコール。 これはあなたの後のことですか?または、もう少しコンテキスト/情報が必要ですか? – Josh

3

-O2はスペース\速度のトレードオフを必要とし、最も頻繁に使用され、私が見る1になる傾向はありませんすべての最適化をオンにします。 -O3は、(インライン関数のような)高速トレードオフのためのスペースを提供します。-O2は、コードサイズを減らすためにO2 plusに他のことを行います。これは、キャッシュの使用を改善することによって、O3よりも高速にすることができます。 (あなたのために働くかどうかを調べるためのテスト)Oスイッチのどれも触れることのない多数のオプションがあることに注意してください。それらが除外される理由は、あなたが書いているコードの種類やアーキテクチャに非常に依存していることが多いからです。

7

gccには、MSVCのように「リリースモード」と「デバッグモード」はありません。すべてのコードは単なるコードです。さまざまな最適化オプション(-O2と-Oは非常に細かいチューニングをしない限り、一般に気にする必要がある唯一のものです)は、生成されたコードを変更しますが、他のABI準拠の相互運用性を妨げる方法ではありませんコード。一般に、リリースしたいものの最適化が必要です。

"-g"オプションがあると、拡張シンボルとソースコードの情報が生成されたファイルに配置されます。この情報はデバッグには役立ちますが、ファイルのサイズが大きくなり、ソースコードが表示されます。あなたはしばしば "リリースされた"バイナリでは望ましくないものです。

しかし、排他的ではありません。最適化とデバッグ情報でコンパイルされたバイナリを持つことができます。

+1

生成されたコードをデバッグする場合は、通常は最適化を無効にする必要があります。そうしないと、デバッグがDavid Lynchのフィルムに似たエクスペリエンスになります。 – caf

+0

それは悪くありません、私はスタック・ダンプとvalgrind出力を常に "リリース"・バイナリから見ます。 -fomit-stack-pointerを使用せず、静的なものがインラインで表示されている可能性があることを理解している限り、非常に最適化されたバイナリであっても非常に多くのコンテキストを読むことができます。あなたの関数が短い場合は、通常、推測または2つでクラッシュした式を把握することができます。 –

+0

しかし、David Lynchの映画とは違って、デバッガを使用すると、さまざまなレベルの現実の間で自由にトグルできるようになります。逆アセンブリを理解していれば、ソースラインが散在した状態でのシングルステッピングは、通常、最適化を行ってもある程度の意味を持ちます。あなたが分解を理解していなければ、あなたは学びます。 –

15

私が定期的に使用するMakefileの一部です(この例では、fooという名前のプログラムをビルドしようとしています)。

あなたが$ make BUILD=debugまたは$ make debug のようにそれを実行した場合、デバッグ CFLAGSが使用されます。これらは最適化(-O0)をオフにし、デバッグシンボル(-g)を含みます。

あなたは(追加パラメータなし$ makeを実行することによって)これらのフラグを省略した場合、あなたが最適化(-O2)、デバッグシンボルが(-s)を剥がし、アサーションが無効になっているリリース CFLAGSのバージョンを構築します(-DNDEBUG) 。

他の人も示唆しているように、具体的なニーズに応じて異なる-O*の設定を試すことができます。

ifeq ($(BUILD),debug) 
# "Debug" build - no optimization, and debugging symbols 
CFLAGS += -O0 -g 
else 
# "Release" build - optimization, and no debug symbols 
CFLAGS += -O2 -s -DNDEBUG 
endif 

all: foo 

debug: 
    make "BUILD=debug" 

foo: foo.o 
    # The rest of the makefile comes here... 
関連する問題