会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 为什么说++i的效率比i++高?!

为什么说++i的效率比i++高?

时间:2025-11-04 23:09:32 来源:益强数据堂 作者:应用开发 阅读:787次

不知道你是率比否听说过++i比i++快的说法,真的率比如此吗?

++i与i++的区别

为什么说++i的效率比i++高?

这两个表达式从我们初学编程语言的时候就会接触到。前者是率比自增后取值,后者是率比取值后自增。

我们看一个简单的率比例子。

#include <iostream> using namespace std; int main() {     int a = 0;     int b = 0;     int c = a++;//int tmp = a;c=a;aa = a + 1     int d = ++b;//bb = b + 1;d = b;     cout<<"c="<<c<<";d="<<d<<endl;     return 0; } 

运行结果:

c=0;d=1   

对于这个结果我们并不感到意外。率比

另外我们还注意到另外一个有意思的率比现象:

#include <iostream> using namespace std; int main() {     int a = 0;     int b = 0;     int *c = &(a++);     int *d = &(++b);     return 0; } 

编译后报错:

main.cpp:7:19: error: lvalue required as unary ‘&’ operand      int *c = &(a++); 

说&作用于左值,也就是率比说a++的结果并非左值。但++b的率比结果是左值。

可简单理解左值和右值:

左值,率比有名对象,率比可赋值 右值,率比临时对象,WordPress模板率比不可被赋值

运算符重载

通过前面的率比例子也发现了,对于内置类型,率比前置自增返回对象的引用,而后置自增返回对象的原值(但非左值)。

基于上述原则,一个前置版本和后置版本的常见实现如下:

class Test { public:     Test& operator++();//前置自增     const Test operator++(int);//后置自增 private:     int curPos; //当前位置 }; /*前置自增实现范式*/ Test& Test::operator++() {     ++curPos;      //自增     return *this;  //取值 } /*后置自增实现范式,为了与前置区分开,多了一个int参数,但从来没用过*/ const Test Test::operator++(int) {     Test tmp = *this;  //取值     ++curPos;             //自增     return tmp; } 

仔细观察后,我们发现前置自增,先自增,后返回原对象的对象;没有产生任何临时对象;而后置自增,先保存原对象,然后自增,最后返回该原临时对象,那么它就需要创建和销毁,这样一来,效率孰高孰低就很清楚了。

在不进行赋值的情况下,免费源码下载内置类型前置和后置自增的汇编都是一样的呢!

void test() {   int i = 0;   i++;   //++i; } 

汇编:

push    rbp mov     rbp, rsp mov     DWORD PTR [rbp-4], 0 add     DWORD PTR [rbp-4], 1 nop pop     rbp ret 

不过,赋值的情况下,并且不开启编译器优化,它们的汇编代码还是有差别的,有兴趣的可以试试。

总结

对于内置类型,前置和后置自增或者自减在编译器优化的情况下,两者并无多大差别,而对于自定义类型,如无特别需要,人们似乎更加偏爱前置自增或自减,因为后置自增常常会产生临时对象。

但是,又能提高多少效率呢?

(责任编辑:数据库)

推荐内容
  • 解决电脑启动Windows错误的方法(解决Windows启动故障的有效策略)
  • 2021 SIEM 必看趋势:如何选择安全分析提供商
  • 链接SQL Server数据库中的字符串经验总结
  • C++库连接来对MySQL数据库进行正确连接
  • 手工制作电脑支架蛋糕教程(用简单材料打造独特创意,将甜点与科技相结合)
  • 利用sql的limit的属性对MySQL数据库并不难