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生成的汇编代码也几乎一致,效率没有差别。