当前位置: 首页 > 科技观察

为什么说++i比i++更高效呢?

时间:2023-03-16 01:47:51 科技观察

不知道大家有没有听过++i比i++快的说法,是真的吗?++i和i++的区别这两个表达式在我们初学编程语言的时候都会接触到我们。前者是获取自增后的值,后者是获取自增后的值。让我们看一个简单的例子。#includeusingnamespacestd;intmain(){inta=0;intb=0;intc=a++;//inttmp=a;c=a;aa=a+1intd=++b;//bb=b+1;d=b;cout<<"c="<usingnamespacestd;intmain(){inta=0;intb=0;int*c=&(a++);int*d=&(++b);return0;}编译后报错:main.cpp:7:19:error:lvaluerequiredasunary'&'operandint*c=&(a++);says&作用于左值,也就是说,a++的结果不是左值。但是++b的结果是一个左值。很容易理解左值和右值:左值,命名对象,可赋值右值,临时对象,不能被赋值运算符重载通过前面的例子也发现,对于内置类型,预增返回的引用对象,然后Setautoincrement返回对象的原始值(但不是左值)。基于以上原则,一个前版本和一个后版本的常见实现如下://当前位置};/*前置自增实现范式*/Test&Test::operator++(){++curPos;//自增return*this;//value}/*后置自增实现范式,为了区别于前置Open,多了一个int参数,但是从来没有用过*/constTestTest::operator++(int){Testtmp=*this;//Value++curPos;//自增returntmp;}仔细观察后发现,前者Set自增,先自增,再返回原对象的对象;没有生成临时对象;而后置自增,先保存原对象,再自增,最后返回原临时对象,然后需要创建和销毁,这样就很清楚哪个高哪个低了降低。在没有赋值的情况下,内置类型前自增和后自增的组装是一样的!voidtest(){inti=0;i++;//++i;}assembly:pushrbpmovrbp,rspmovDWORDPTR[rbp-4],0addDWORDPTR[rbp-4],1noppoprbpret但是在赋值的情况下,编译器优化不了开机,他们的汇编代码还是不一样的,有兴趣的可以试试。总结对于内置类型,在编译器优化的情况下,pre-increment和post-increment或auto-decrement没有太大区别,但是对于自定义类型,如果没有特殊需要,人们似乎更喜欢pre-increment或者自减Decrement,因为后自增往往会产生临时对象。但它能提高多少效率呢?