実行速度に関してn/=10
との間に違いはありますか?n=n/10
同様n--
に--n
、実行速度も異なります...
いいえ、そうではありません。
[C99: 6.5.16.2/3]:
フォームの複合代入は、左辺値が 1 回だけ評価されるという点でのみE1 op= E2
、単純な代入式と異なります。E1 = E1 op (E2)
E1
したがって、これは、 yourn
が副作用 (関数呼び出しなど) を伴う自明でない式である場合にのみ結果をもたらします。
それ以外の場合、理論的には中間の一時変数が関与すると思いますが、コンパイルされた実行可能ファイルで実際にそのような一時変数が生き残るには、非常に不運である必要があります。2 つのアプローチ間でパフォーマンスの違いは見られません。
これをベンチマークで確認し、結果のアセンブリを比較します。
次の C コードがあるとします。
int f1(int n) {
n /= 10;
return n;
}
int f2(int n) {
n = n / 10;
return n;
}
gcc -O4
本質的に次の結果でコンパイルされた
f1:
movl %edi, %eax
movl $1717986919, %edx
sarl $31, %edi
imull %edx
sarl $2, %edx
subl %edi, %edx
movl %edx, %eax
ret
f2:
movl %edi, %eax
movl $1717986919, %edx
sarl $31, %edi
imull %edx
sarl $2, %edx
subl %edi, %edx
movl %edx, %eax
ret
実際のリストの一部であるボイラープレートを省略しました。
この特定のケースでは、2 つの選択肢に違いはありません。
使用するコンパイラ、命令が実行される実際の環境、およびコンパイラの最適化レベルによって、生成されるコードが異なる場合があります。ただし、このアプローチをいつでも使用して、結果のマシン コードが異なるかどうかを確認できます。
両方とも b/w に違いはありません。