-
拉莫斯之舞
执行摘要:否。i++可能比++i,因为旧的价值i可能需要保存以供以后使用,但在实践中,所有现代编译器都将对此进行优化。我们可以通过查看此函数的代码来演示这一点,++i和i++.$ cat i++.cextern void g(int i);void f(){
int i;
for (i = 0; i < 100; i++)
g(i);}文件是相同的,除了++i和i++:$ diff i++.c ++i.c6c6< for (i = 0; i < 100; i++)---> for (i = 0; i < 100; ++i)我们将编译它们,并获得生成的汇编程序:$ gcc -c i++.c ++i.c
$ gcc -S i++.c ++i.c我们可以看到,生成的对象和汇编程序文件都是相同的。$ md5 i++.s ++i.s
MD5 (i++.s) = 90f620dda862cd0205cd5db1f2c8c06eMD5 (++i.s) = 90f620dda862cd0205cd5db1f2c8c06e$ md5 *.o
MD5 (++i.o) = dd3ef1408d3a9e4287facccec53f7d22
MD5 (i++.o) = dd3ef1408d3a9e4287facccec53f7d22
-
慕姐4208626
从…效率与意图安德鲁·科尼格:首先,我们还不清楚++i比i++,至少在涉及整数变量的情况下。以及:因此,我们应该问的问题不是这两种操作中哪一种更快,而是这两种操作中哪一种更准确地表达了您想要完成的任务。我认为,如果您不使用表达式的值,则永远不会有使用该表达式的理由。i++而不是++i,因为从来没有理由复制变量的值,增加变量,然后丢弃副本。因此,如果没有使用结果值,我将使用++i..但这并不是因为它更有效率,而是因为它正确地陈述了我的意图。
-
哔哔one
更好的答案是++i有时会更快但永远不会变慢。似乎每个人都认为i是一个常规的内置类型,如int..在这种情况下,不会有可衡量的差别。但是如果i是复杂的类型,那么你很可能会发现一个可衡量的差别。为i++在增量类之前,必须复制类的副本。根据副本中涉及的内容,它实际上可能会慢一些,因为++it您可以只返回最后的值。Foo Foo::operator++(){
Foo oldFoo = *this; // copy existing value - could be slow
// yadda yadda, do increment
return oldFoo;}另一个不同之处在于++i您可以选择返回引用而不是值。同样,根据创建对象副本所涉及的内容,这可能会慢一些。在现实世界中,这种情况可能发生的例子是迭代器的使用。复制迭代器不太可能成为应用程序的瓶颈,但养成使用++i而不是i++结果不受影响的地方。