关于C++中使用++it仍是it++的问题

咱们常常使用for循环来遍历东西,循环变量能够前自增也能够后自增,发现对遍历结果没啥影响,可是该如何选择呢?算法

咱们应该尽可能使用前自增运算符而不是后自增运算符,即用 ++ Iter 代替 Iter++ 。 工具

为何要这么作,有什么有实际价值?下面我会详细解释。性能

前缀和后缀形式之间的区别是众所周知的。我但愿它们内部结构的区别(告诉了咱们运算法则)你们也是清楚的。若是你有使用过运算符重载的话,确定已经意识到了。没有用过的话,我在这儿简单地解释一下(用过运算符重载的能够跳过下面关于运算符重载的例子)。单元测试

前自增运算符改变了对象的状态并返回对象改变后的状态,不须要建立临时对象。下面是前自增运算符的例子:测试

MyOwnClass& operator++()
{优化

  ++meOwnField;this

  return (*this);
}spa

后自增运算符也改变了对象的状态可是返回的是对象改变前的状态,而且须要建立一个临时对象。下面是后自增运算符重载的例子:调试

MyOwnClass operator++(int)
{对象

  MyOWnCLass tmp = *this;

  ++(*this);

  return tmp;
}

看到上面这段代码,你会发现有一个额外的操做,就是要建立一个临时对象,在实践中这点过重要了!

如今的编译器作代码优化的时候很是智能,若是没有用处,是不会随便建立临时对象的。这就是为何在发布版中咱们很难发现 i++ 和 ++ i 的区别。

可是在调试模式下进行程序调试的时候就是另外一回事了,这时候你会看到性能上有很大差异。

举个例子,在这篇文章中,有一些例子能够估计调试版本中使用前自增和后自增运算符的代码运行时间,咱们能够看到使用后缀形式所用时间几乎是前缀的四倍。

有人会说:”那又怎么样?反正发布版都是同样的。”,这种想法说对也对说不对也不对。一般咱们会花更多的时间作单元测试和调试程序,因此大多数时间都在调试版本下工做,谁也不想浪费时间在那儿等吧?

关于“对于迭代器,咱们是否应该用前自增运算符(++i)来代替后自增运算符(i++)?”这个问题,我想认真地回答: “是的,真应该这么作”。 你会发如今调试版本中速度大大提高。 若是迭代器很复杂的话,这么作的好处更是显而易见了。

这个错误是用静态代码分析工具 PVS-Studio 发现的,错误信息为:V803 性能降低。 若是iter是迭代器的话,使用前自增运算符会更高效,使用 ++iter 代替 iter++.

 

无论咋样,请用 ++ Iter 代替 Iter++,这是一个好的代码习惯。

相关文章
相关标签/搜索