g++ 最適化オプション
g++の最適化オプションは、C++のソースコードをコンパイルするときに、プログラムの実行スピードを上げるための最適化やコードサイズを小さくするといったことを制御するために使われます。
概要
g++の最適化オプションには、 -O -O0 -O1 -O2 -O3 -Os -Ofast -Og があります。最適化を行うには、コンパイルに時間がかかり、大きな関数はメモリをたくさん消費します。最適化レベルを上げることによって、コンパイル時間は増加します。
複数の最適化オプションが指定された場合は、最後に指定されたものが有効になります。
-O0
g++は-O0を指定されたとき、最適化を行いません。 コンパイル時間を短くします。デバッグプロセスが正しく機能します。
-O, -O1
-O, -O1 は、基本的な最適化を行います。レジスタに不要な移行を行わない、メモリアクセスを減らすためにレジスタに値を保存するといった最適化を行います。コードサイズと実行時間を小さくする最適化を行います。-fthread-jumpsと-fdefer-popが有効になります。
-O を指定しない場合、 register 宣言した変数以外は、レジスタに割り当てられません。
-O では、以下のオプションが有効になります。
-fauto-inc-dec -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -fipa-pure-const -fipa-profile -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-slsr -ftree-sra -ftree-pta -ftree-ter -funit-at-a-time
-Oでは、デバッキングの邪魔にならない場合、-fomit-frame-pointer が有効になります。
最適化の詳細は、g++ -Oオプションの最適化をご参照ください。
-O2
-O2では、ほとんどの最適化を行います。ループの展開や関数のインライン展開は行いません。-Oよりもコンパイル時間が増えるが、生成コードの効率がよくなります。
-O2では、以下のオプションが有効になります。
-fthread-jumps -falign-functions -falign-jumps -falign-loops -falign-labels -fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-small-functions -findirect-inlining -fipa-sra -foptimize-sibling-calls -fpartial-inlining -fpeephole2 -fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop -fsched-interblock -fsched-spec -fschedule-insns -fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-switch-conversion -ftree-tail-merge -ftree-pre -ftree-vrp
最適化の詳細は、g++ -O2オプションの最適化をご参照ください。
-O3
-O3では、-O2で指定されたすべての最適化に加えて、以下のオプションを有効にします。
-finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-loop-vectorize, -ftree-slp-vectorize, -fvect-cost-model, -ftree-partial-pre -fipa-cp-clone
最適化の詳細は、g++ -O3オプションの最適化をご参照ください。
-Os
-Osは、サイズの最適化を行います。-Osでは、-O2の最適化で典型的にコードサイズを増加させないオプションをすべて有効にします。コードサイズを小さくするために設計された高速な最適化を実行します。
-Os では、以下の最適化フラグを無効化します。
-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays
最適化の詳細は、g++ -Osオプションの最適化をご参照ください。
-Ofast
厳格な標準準拠を無視します。-Ofastは、-O3のすべての最適化を有効にします。 標準準拠プログラムに反する最適化を有効にします。 -ffast-mathとフォートラン固有の -fno-protect-parens と -fstack-arraysを有効にします。
最適化の詳細は、g++ -Ofastオプションの最適化をご参照ください。
-Og
デバッキング体験の最適化をします。デバッキングの邪魔にならない最適化を有効にします。これは、標準 編集-コンパイル-デバッグサイクルのために選ばれた最適化レベルでなければなりません。高速なコンパイルと良いデバッグ体験が保たれた、合理的な最適化レベルが提供されます。
最適化の詳細は、g++ -Ogオプションの最適化をご参照ください。
関連項目
ツイート