C++中前自增和后自增的区别(转载\整理)

几乎所有有“++”语法的语言都一样:例,++i 是先加1后使用i;i++是先使用i后加1。

C++中的区别:

    前自增生成左值,再给操作数加1后,返回改变后的操作数值;后自增生成右值,给操作数加1,但返回未改变的操作数原值。(左值:可以出现在赋值操作符左边的值,非const左值可读可写。右值:只能用在赋值操作符的右边,右值只能读不能写)

    对于自定义类型,前自增返回的是自增后的“自己”,而后自增返回的是自增前“自己的副本”(临时变量),以对象为例,前自增先对对象作加1操作,然后返回对象的引用;后自增用一个临时变量保存对象,然后对对象作加1操作,返回临时变量即对象本身。此时,因后自增要生成临时变量要返回对象本身,开销会比前自增大。

总结:在对内建类型的操作时前自增和后自增效率没太大区别;在对自定义类型操作时前自增效率高于后自增。

以下是VS2010中生成的汇编代码

    i++;
00B2137C  mov         eax,dword ptr [i]  
00B2137F  add         eax,1  
00B21382  mov         dword ptr [i],eax  
    ++i;
00B21385  mov         eax,dword ptr [i]  
00B21388  add         eax,1  
00B2138B  mov         dword ptr [i],eax  
    x = i++;
00B2138E  mov         eax,dword ptr [i]  
00B21391  mov         dword ptr [x],eax  
00B21394  mov         ecx,dword ptr [i]  
00B21397  add         ecx,1  
00B2139A  mov         dword ptr [i],ecx  
    x = ++i;
00B2139D  mov         eax,dword ptr [i]  
00B213A0  add         eax,1  
00B213A3  mov         dword ptr [i],eax  
00B213A6  mov         ecx,dword ptr [i]  
00B213A9  mov         dword ptr [x],ecx

    可以看出只执行++i或i++时,它们的汇编代码完全一致,对于x=i++和x=++i生成的汇编代码也几乎一致,效率没有差别。

posted on 2013-05-28 12:51  夜月升  阅读(3556)  评论(0编辑  收藏  举报

导航