3

実行速度に関してn/=10との間に違いはありますか?n=n/10

同様n----n、実行速度も異なります...

4

4 に答える 4

5

いいえ、そうではありません。

[C99: 6.5.16.2/3]:フォームの複合代入は、左辺値が 1 回だけ評価されるという点でのみE1 op= E2、単純な代入式と異なります。E1 = E1 op (E2)E1

したがって、これは、 yournが副作用 (関数呼び出しなど) を伴う自明でない式である場合にのみ結果をもたらします。

それ以外の場合、理論的には中間の一時変数が関与すると思いますが、コンパイルされた実行可能ファイルで実際にそのような一時変数が生き残るには、非常に不運である必要があります。2 つのアプローチ間でパフォーマンスの違いは見られません。

これをベンチマークで確認し、結果のアセンブリを比較します。

于 2013-04-08T12:54:54.733 に答える
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 つの選択肢に違いはありません。

使用するコンパイラ、命令が実行される実際の環境、およびコンパイラの最適化レベルによって、生成されるコードが異なる場合があります。ただし、このアプローチをいつでも使用して、結果のマシン コードが異なるかどうかを確認できます。

于 2013-04-08T12:59:17.730 に答える
0

両方とも b/w に違いはありません。

于 2013-04-08T14:51:14.163 に答える