++ i与i ++:现代编译器有什么区别吗?

时间:2011-02-16 17:09:04

标签: c++ c compiler-construction

  

可能重复:
  Is there a performance difference between i++ and ++i in C++?

我理解:

i++;

应该采取比

更多的指示
++i;

因为它生成了一个您不需要使用的中间结果,所以人们将“++ i”放在对中间结果没有用处的代码行上。

然而,编译器非常聪明,他们可以判断结果是否被使用。他们可以说出各种各样的事情。但它们并不神奇

所以我很好奇 - 在现代编译器上确实选择了另一种实际问题,或者它是否只是简单地编译成相同的机器代码?

4 个答案:

答案 0 :(得分:9)

int上使用它无关紧要。但是,当使用迭代器或其他重载operator++的对象时,它可能仍会有所不同。

答案 1 :(得分:2)

这对本机类型没有区别,但可以对用户定义的类型(即类,结构,枚举,...)做一些改动,因为用户可以重载运算符,并且后缀为({{ 1}})有时可能会慢一些。

答案 2 :(得分:1)

在C中,应该没有区别。如果没有使用,编译器足够聪明,可以优化额外的副本。在C ++中,它可以产生巨大的差异,因为如果i定义的变量可以是分别定义operator++的前缀和后缀版本的类型,这使得编译器无法删除一般情况下的副本。因此,即使没有使用它,编译器也无法删除副本。

为了保持一致性,我将使用前缀表单,除非您必须使用后缀表单。 (即使我认为后缀形式“更漂亮”)

答案 3 :(得分:1)

Visual C ++似乎在每种情况下输出相同的代码:

    i++;

00AB149C  mov         eax,dword ptr [i]  
00AB149F  add         eax,1  
00AB14A2  mov         dword ptr [i],eax  

    ++j;

00AB14A5  mov         eax,dword ptr [j]  
00AB14A8  add         eax,1  
00AB14AB  mov         dword ptr [j],eax