i++和++i哪个更高效?

15

请看 http://stackoverflow.com/questions/53455/ 和 https://dev59.com/LXRB5IYBdhLWcg3w3K8J。 - basszero
1
因为这个问题之前已经被问过了,而且没有人愿意去找原始的问题。 - basszero
多个重复问题显然是被踩的一个很明显的原因。在 Google 和 SO 中都有搜索功能。 - Anonymous
2
我提出这个问题并不是为了让一个慢应用程序变得更快。我之所以问,是因为我对不同编程语言的实现方式很好奇。非常抱歉在试图更好地理解事物运作时问了一个愚蠢的问题。 - Berek Bryan
如果这是JavaScript,那么就会有速度差异,如下所示:http://jsperf.com/loop-inc-test截至今天,在Chrome中i++会更快,而在IE10中i+=会更快。 :) - James Wilkins
显示剩余3条评论
20个回答

50

i++ :

  • 创建 i 的临时副本
  • 将 i 增加 1
  • 返回临时副本

++i :

  • 将 i 增加 1
  • 返回 i

开启优化后,生成的汇编代码可能相同,但是 ++i 更有效率。

注意,在 C++ 中,i 可能是任何支持前缀和后缀 ++ 运算符的对象。对于复杂对象来说,临时副本的代价是不可忽略的。


在许多处理器上,这两个操作都是单个指令。 - Paul Tomblin
这个问题标记了C++和Java。我想知道Java是否有所不同。 - izb
+1 取决于 i 是什么...对于整数原语,这些操作很可能是完全相同的。 - thekidder
@Edourad A:干净简洁的答案点赞!那么在没有编译器的JavaScript中呢?在原型库中,他们说++i更快。 - Marco Demaio

37

我会在其他地方寻找优化潜力。


7

效率不应该是您关注的重点:它是意义。除非它们是独立的,否则两者并不相同:一个在使用值之前操作,另一个在使用之后操作。

int i; i = 1; cout << i++; //返回1

int i; i = 1; cout << ++i; //返回2

当意义不重要时,大多数编译器将把++i和i++(比如在for循环中)转换为相同的机器/虚拟机代码。


5

在现代编译器中,这并不重要。

int v = i++;  

是相同的。
int v = i;
i = i + 1;

现代编译器会发现 v 没有被使用,而且计算 v 的代码是纯的(没有副作用)。然后它会删除 v 和赋值代码,并生成以下代码:

i = i + 1;

为什么要点踩?如果你没有使用副作用,他是对的,没有任何区别。 - Paul Tomblin
我也正想问同样的问题。 - kemiller2002
今天可能并不重要,因为硬件变得更便宜且速度极快。然而,10年前这个问题是完全合理的。 - Elroy
1
并不是所有的软件都旨在运行在最新的台式电脑上。 - izb
1
那么您也面临着一个新问题。 “ADD”和“INC”哪个更快… :-) (提示:这取决于处理器!) - Brian Knoblauch

3

这很重要!特别是如果你在C++领域使用自定义迭代器协议...

++i // the prefered way, unless..
auto j = i++ // this is what you need

为了避免必要的复制开销,您应该使用前缀表示法,但它只适用于迭代器,不适用于内置本地类型,这些类型只需要一条指令。


2
"++i不需要一个临时变量来存储东西。可以这样想:"
"

++i

"
int preIncrement(int i)
{
    i = i + 1;
    return i;
}

i++

int i = 5; // as an example
int postIncrement(_i)
{
    int temp = _i;
    i = _i + 1;
    return temp;
}

看到了吗?后增量需要一个临时变量。假设编译器没有为您解决这个问题,尽管它几乎肯定会这样做。
当然,更重要的是程序逻辑;如果您太过担心这个问题,就有遭遇微优化悲剧的风险... :)

2

在C++中,我相信它们有不同的用途,取决于你想何时更新变量。

效率不应该决定你使用哪个而不是另一个,但我认为无论哪种方式它们都应该具有相同的效率。


没错,++i 会先加一再使用该值,而 i++ 则是先使用该值再加一。 - Decio Lira

2

对于operator++的非平凡实现,++i可能更有效率,但即使在这种情况下,编译器也可以优化掉中间临时变量。


0

++i更快,因为i++需要存储i,然后增加它,最后返回i的存储值。而++i只需增加i,然后返回它。

// ++i
i += 1;
return i;

// i++
temp = i;
i += 1;
return temp;

0

通常来说,输入i++更容易,因此在生产力时间方面更有效率。

但是,如果i是本地数据类型(例如int、double等),则没有区别。

如果它是用户定义的类型,则取决于实现。

class Type
{
    Type& operator ++(){}
    const Type& operator ++(int i){}
};  

T i;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接