a + = b和a = a + b之间的性能差异

时间:2016-07-15 09:53:00

标签: c

我知道下面的两个陈述给出了相同的结果:

a+=b; 
a=a+b;

对于a += ba仅评估一次,而在a = a + b的情况下,a评估两次。

两者之间的表现有什么不同?如果没有,上述哪些地方存在差异?

2 个答案:

答案 0 :(得分:4)

从标准(第6.5.16.2节,第3点):

  

E1 op = E2 形式的复合作业不同于简单赋值表达式 * E1 = E1 op (E2)只是因为左值 E1 仅被评估一次

也就是说,如果您正在做

*a += 1

它只会确定目标位置一次而不是两次。对于像您的示例中的“简单”变量,它可能没有多大区别。当然,如果编译器知道不需要两次,它仍然可以优化并执行一次。如果有其他实体可以更改指针(例如另一个线程),则存在真正的差异。

编辑:也许更好的例子是像下面这样奇怪的事情(在我的情况下滥用& b ==& a-1这一事实):

int a, b, *p;

a = 1; b = 5; p = &a;
*p += (--p == &b) ? 1 : 0;
printf("%d %d\n",a,b); // prints 1 6, because --p happens first, then *p

a = 1; b = 5; p = &a;
*p = *p + ((--p == &b) ? 1 : 0);
printf("%d %d\n",a,b); // prints 1 2, because the second *p is evaluated first,
                       // then --p and then the first *p

答案 1 :(得分:1)

a+=1可能是最好的方式(但性能差异几乎无关紧要)。如果您正在尝试实现某些性能改进,则应该查找代码的其他部分。