2017-07-08 2 views
7

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlから引用:GCCがO2/O3で最適化を有効にするのはなぜですか?

-falign-ラベル

-falign-ラベル= N

整列全ての分岐ターゲットを2のべき乗の境界などのnバイトまでスキップ - falign-functions。 通常のコードフローで 分岐ターゲットに到達したときにダミーオペレーションを挿入する必要があるため、このオプションを使用すると、コードが遅くなります()。

-fno-align-labelsと-falign-labels = 1は同等であり、ラベルが整列していないことを意味します。

-falign-loopsまたは-falign-jumpsが適用され、この値が より大きい場合は、その値が代わりに使用されます。

nが指定されていないかゼロの場合は、マシンに依存するデフォルトの を使用してください。これは、アライメントがないことを意味する '1'となる可能性が非常に高いです。

-O2、-O3レベルで有効になります。もっとこのフラグを考える

は、それがさらに意味を失うことになります...コード・キャッシュ・ミスを誘発の結果、どのようなパラメータが数値とるときにも手段を有効にあります(1 ..)?

+1

「nが指定またはゼロで、何のアライメントを意味しない、 『1』である可能性が非常に高いマシン依存のデフォルトを使用していない場合。」したがって、デフォルトでは、gccはマシン依存の値を使用します。 – Justin

+1

IIRCサイズの最適化です。 – stybl

+1

これは興味深い質問です。投稿していただきありがとうございます。 –

答えて

5

それは言わない。 は簡単にコードを遅くすることができると言います。特定の状況では、コードを遅くすることができます。他の状況では、コードをより速くすることができます。

アライメントが遅くコードを実行するために発生します

  • は、コードサイズが増加し、そのコードがキャッシュされていないことが高い可能性があります。ブランチ予測、命令フェッチ、そして神は、知っている - 何を:

アライメントは高速なコードを実行する可能性があり、コードを遅くnop操作を追加しました。

ifが1つの場合は、どの効果が強いのかが分かりません。条件によって異なります。

しかし、ループの場合、通常はコードが高速になります。どうして?遅い要因は一度だけ起こるので、ループのすべてのサイクルがより速く実行されるからです。

(私のGCCが8にラベルを揃えるように見える)

関連する問題