为什么说++i的效率比i++高?
2019-09-20 12:05
369 查看
脚本之家
你与百万开发者在一起
来源:公众号【编程珠玑】
作者:守望先生
网站:https://www.yanbinghu.com
前言
不知道你是否听说过++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;a = a + 1
int d = ++b;//b = b + 1;d = b;
cout<<"c="<<c<<";d="<<d<<endl;
return 0;
}
运行结果:
c=0;d=1
对于这个结果我们并不感到意外。
另外我们还注意到另外一个有意思的现象:
//来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
#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的结果是左值。
可简单理解左值和右值:
左值,有名对象,可赋值
右值,临时对象,不可被赋值
运算符重载
在《运算符重载》一文中已经说到了运算符的重载,通过前面的例子也发现了,对于内置类型,前置自增返回对象的引用,而后置自增返回对象的原值(但非左值)。
基于上述原则,一个前置版本和后置版本的常见实现如下:
//来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
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
不过,赋值的情况下,并且不开启编译器优化,它们的汇编代码还是有差别的,有兴趣的可以试试。
总结
对于内置类型,前置和后置自增或者自减在编译器优化的情况下,两者并无多大差别,而对于自定义类型,如无特别需要,人们似乎更加偏爱前置自增或自减,因为后置自增常常会产生临时对象。
但是,又能提高多少效率呢?
更多精彩
在公众号后台对话框输入以下关键词
查看更多优质内容!
女朋友 | 大数据 | 运维 | 书单 | 算法
大数据 | JavaScript | Python | 黑客
AI | 人工智能 | 5G | 区块链
机器学习 | 数学 | 送书
相关文章推荐
- 为什么++iter 效率好于 iter++
- 为什么要重视有效性而不仅仅是效率
- 为什么5%的技术人员开发效率是其他95%的20倍?
- 为什么程序员的工作效率跟他们的工资不成比例(转)
- 为什么乐观锁效率高于悲观锁?(转,该文章没有给出满意回答)
- 关于为什么保存Transform等引用效率会更高
- 感叹一下:为什么CLR可以保持效率
- 【转】 【概念】为什么有时全表扫描比通过索引扫描效率更高
- GUI为什么不设计为多线程(用户事件和底层事件的流程是相反的,每层都加锁效率太低,共用一把锁那就是单线程)
- 为什么存储过程比sql语句效率高?
- 为什么程序员的工作效率跟工资不成比例
- 为什么前置++比后置++的效率高
- 为什么说 WebService 的效率不高(整理)
- 为什么大多Virtual Globe程序纵向旋转效率比较低
- var a=[]; 和 var a=new Array(); 的区别,为什么前者效率高
- 【概念】为什么有时全表扫描比通过索引扫描效率更高
- 为什么判断 std::vector 是否为空时,用 if(0==vec.size()) 提示效率低,但用 if (vec.empty()) 正常?
- [置顶] day38.switch语句为什么效率这么高
- 前置++为什么比后置++效率高
- 为什么建立了索引可以提高效率