差值为n / = 10和n = n / 10

时间:2013-04-08 12:45:03

标签: c microcontroller

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

就像n----n执行速度明显不同......

4 个答案:

答案 0 :(得分:5)

不,不是真的:

  

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

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

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

使用基准确认,并比较生成的装配。

答案 1 :(得分: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 :(得分:0)

两者没有区别。

答案 3 :(得分:-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--