今天参加面试的时候被问到了一个问题 “++i和i++在效率上有没有什么区别”,想了想除了语义上的区别,觉得应该没有别的区别呀,回来google下发现自己果然too young。
1.语义区别:
i++ :将i加1,求值结果是i+1之前的i的一个副本
++i : 先执行i=i+1,然后返回求值后i的值
2.效率区别:
- 若i是内置的数值类型,两者完全一样
- 若i是一些自定义的类,++i的效率 > = i++的效率
分析:
递增(++)和递减(--)运算符都有前置和后置版本,这两种版本都必须需作用于左值运算对象,其中前置版本将对象作为左值返回,而后置版本则把对象原始值的副本作为右值返回,因此前置可以返回对象的引用,而后置则不可以,这导致对大的对象使用后置时,会造成额外的复制开销。
结论:
除非必要情况,否则最好使用递增递减运算符的前置版本。
补充:
* 在C++中,对前置和后置自增、自减运算符的的重载的实现:
operator++的前缀和后缀形式在语义上完全不同,因此需要为为每种形式分别编写例程。由于他们具有相同的名字,因此需要用不同的特征进行区分,
C++规定,前缀形式指定空参数列表,后缀形式指定(匿名的)单参数int,从而区分它们。
List类的一个实现的例子(p73):
iterator & operator++ ( ) {
this->current = this->current->next;
return *this;
}
iterator & operator++ (int) {
iterator old = *this;
++(*this);
return old;
}
参考:
- i++与++i哪个效率更高
- 在程序开发中,++i 与 i++的区别在哪里?
- 《数据结构与算法分析 C++语言描述》(Mark Allen Weiss)