i ++ 和 ++i 哪个效率更高?
在这里声明,简单地比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。首先考虑内建数据类型的情况:如果自增运算表达式的结果没有被使用,而是仅仅简单地用于增加一员操作数,答案是明确的,前缀法和后缀法没有任何区别,编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁地在二者之间制造任何差异。我们看看下面这个程序。
(1)++i 返回对象的引用;
(2)i++ 总是要创建一个临时对象,在退出函数时还要销毁它,而且返回临时对象的值时还会调用其拷贝构造函数,
导致在大对象的时候产生了较大的复制开销,引起效率降低。因此使用自定义类型(注意不是指内建类型)的时候,
应该尽可能地使用前缀式递增或递减。
下面代码可以展示两者的区别
#include<iostream>
using namespace std;
class Integer {
public:
Integer(long data) :m_data(data) {}
Integer& operator++() { //前置版本,返回引用
cout << " Integer::operator++() called!" << endl;
m_data++;
return *this;
}
Integer operator++(int) { //后置版本,返回对象的值
cout << " Integer::operator++(int) called!" << endl;
Integer temp = *this;
m_data++;
return temp; //返回this对象的旧值
}
private:
long m_data;
};
void main(void)
{
Integer x = 1; //call Integer(long)
++x; //call operator++()
x++; //call operator++(int)
}