【C++杂记】 i++与++i 的效率问题

今天参加面试的时候被问到了一个问题 “++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;
}

参考:

  1. i++与++i哪个效率更高
  2. 在程序开发中,++i 与 i++的区别在哪里?
  3. 《数据结构与算法分析 C++语言描述》(Mark Allen Weiss)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容