ソースコードに書き込む命令の数は、コンパイラが生成するマシン命令の数に厳密には関係しません。
ほとんどのコンパイラは賢くあり、2番目の例のようなコードを生成することができます彼らはループが常に5回反復することを検知するため、自動的に
operation();
operation();
operation();
operation();
operation();
。また
あなたがプロファイリング指向の最適化を行うと、コンパイラはループが、それは次のようにしても、コードと反復の一般的な数のためにそれをアンロールも小さなボディと非常に高い繰返し回数があることを認識した場合:
while (count >= 5) {
operation();
operation();
operation();
operation();
operation();
count -= 5;
}
while (count > 0) {
operation();
count--;
}
を
これは、ナイーブバージョンと比較して、テストの約5分の1を大きなcount
にします。
これが価値があるかどうかは、プロファイリングだけが知ることができるものです。
あなたはコードが少なくとも一度実行する必要があることを確かに知っていればあなたができることの一つは
do {
operation();
} while (--count);
代わりの
while (count--) {
operation();
}
count==0
がやや迷惑である可能性を書くことですほとんどのコンパイラによって生成されたコードでは、余分なJMPフォワードを必要とするため、CPUのために:
jmp test
loop:
...operation...
test:
...do the test...
jne loop
Cコードがコンパイルされたら
代わりdo { ... } while
バージョンのマシンコードはながらforループは、機械語で比較文に変換され、
loop:
... opertion ...
... do the test...
jne loop
これは何もする必要はありません。より効果的であれば、コンパイラはすでにループを展開しています。 – ThiefMaster
なぜそれをしたいですか?命令キャッシュのスペースが増え、命令のデコードが多くなり、基本的に悪化します。それが良ければ、コンパイラはそれをあなたのために変換しないでしょうか? (それが迷惑でない限り、なぜあなたはそれを使用していますか?) –