1

考虑以下两个示例。

class ClassOne
{
 //class definition is here
};

std::vector< ClassOne > myListOfObjects;

std::vector< ClassOne >::const_iterator iter = myListOfObjects.begin();

Example 1: 
for( ; iter < myListOfObjects.end(); **++iter**)
{
   //some operations
}

OR

Example 2: 
for( ; iter < myListOfObjects.end(); **iter++**)
{
   //some operations
}

哪个更快?++iter 或 iter++ 在循环的上下文中。

关闭原因:

复制自布赖恩的帖子(使问题更简洁)。

您也可以尝试以下类似问题之一:herehereherehere

4

6 回答 6

8

不,它们没有相同的性能:

  • Postincrement 将创建一个副本然后递增,然后返回该副本
  • Preincrement 将递增然后返回原始值

所以(除非你正在处理像整数这样的简单事情)预增量更快。

于 2009-03-10T17:50:52.453 回答
5

this answer中所述, pre 更快。只有在处理原语(int、char 等)时它们才相同。在这种情况下,他们正在调用重载运算符。

于 2009-03-10T17:52:13.200 回答
3

这取决于。在幼稚的编译器中,预增量会更快。在伪代码中,他们每个人的作用如下:

preincrement() {
  val = val + 1;
  return val;
}

postincrement() {
 tmp = val; // take a temporary copy of the old value
 val = val + 1;
 return tmp;
}

在实践中,编译器通常会在可以摆脱的情况下将后增量转换为前增量。但对于复杂类型,它可能无法做到这一点。作为一般规则,尽可能使用前增量,并且仅在需要该操作的特定语义时才使用后增量。

于 2009-03-10T17:55:55.577 回答
2

处理非原始类型时:++iter 总是更有效。

++iter 更高效的原因归结为每个人需要做的工作才能获得它们的返回值。返回值是否被实际使用并不重要。

区别:

  • ++iter 返回对自身的引用,因此不需要临时副本。(递增,返回对自身值的引用)

  • iter++ 返回变量的临时副本(使用旧值创建临时变量,增量,返回临时变量)

    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
    

您也可以尝试以下类似问题之一:herehereherehere。尽管它们不适用于迭代器,但它们并不完全相同。

于 2009-03-10T17:49:32.723 回答
0

我几乎肯定它们在机器代码中简化为相同的东西,只是顺序不同。我会说它们是相同的,但我建议您编写一个快速测试应用程序来检查。

于 2009-03-10T17:49:18.870 回答
0

一般来说,预增量更好,前提是您没有对后增量的特定需求。

但是,这是编译器特定的事情。大多数现代编译器将为前缀表示法创建更少的操作。但是,对于类方法重载,这并不总是得到优化,因为它取决于类的实现方式。

于 2009-03-10T17:51:34.917 回答