3

执行速度之间n/=10有什么区别吗?n=n/10

就像n--并且--n在执行速度方面也有所不同......

4

4 回答 4

5

不,不是真的:

[C99: 6.5.16.2/3]:形式的复合赋值E1 op= E2与简单赋值表达式的不同之处E1 = E1 op (E2)仅在于左值E1只计算一次。

因此,仅当您n是具有副作用的非平凡表达式(例如函数调用)时,这才会产生后果。

否则,我想理论上会涉及一个中间临时变量,但你必须非常不幸,这样一个临时变量才能在你编译的可执行文件中真正存在。您不会看到这两种方法之间的任何性能差异。

用基准确认这一点,并通过比较生成的程序集。

于 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

我省略了一些样板文件,这些样板文件实际上是列表的一部分。

在这种特定情况下,两种选择之间没有区别。

根据使用的编译器、执行指令的实际环境和编译器优化级别,生成的代码可能会有所不同。但是您始终可以使用这种方法来检查生成的机器代码是否不同。

于 2013-04-08T12:59:17.730 回答
0

两者没有区别。

于 2013-04-08T14:51:14.163 回答
-2

我已经在 KEIL 交叉编译器中检查了这两个表达式和所需的相同执行时间:

=================================================
     5: x=x/5; 
     6:  
C:0x0005    EF       **MOV      A,R7**

C:0x0006    75F005   **MOV      B(0xF0),#0x05**

C:0x0009    84       **DIV      AB**

     7: x/=5; 

C:0x000A    75F005   **MOV      B(0xF0),#0x05**

C:0x000D    84       **DIV      AB**

C:0x000E    FF       **MOV      R7,A**

================================================

因此,没有任何区别,例如--nn--

于 2013-04-08T13:13:57.470 回答