在C中,i ++和++ i之间有性能差异吗?
如果不使用结果值, i++
和++i
之间是否存在性能差异?
内容提要:没有。
i++
可能是慢++i
,因为旧的价值i
可能需要被保存以备后用,但实际上所有的现代编译器将优化送人。
我们可以通过查看这个函数的代码来证明这一点,用++i
和i++
。
$ cat i++.c
extern void g(int i);
void f()
{
int i;
for (i = 0; i < 100; i++)
g(i);
}
这些文件是相同的,除了++i
和i++
:
$ diff i++.c ++i.c
6c6
< 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) = 90f620dda862cd0205cd5db1f2c8c06e
MD5 (++i.s) = 90f620dda862cd0205cd5db1f2c8c06e
$ md5 *.o
MD5 (++i.o) = dd3ef1408d3a9e4287facccec53f7d22
MD5 (i++.o) = dd3ef1408d3a9e4287facccec53f7d22
从效率与意图通过Andrew Koenig:
首先, ++i
比i++
更有效率,至少在涉及整数变量的地方是远远不明显的。
和:
因此,人们应该问的问题不是这两个操作中的哪一个更快,而是这两个操作中的哪一个更准确地表达你正在尝试完成的操作。 我提出如果你没有使用表达式的值,那么从来没有理由使用i++
而不是++i
,因为从来没有理由复制变量的值,增加变量,然后抛出复制。
所以,如果不使用结果值,我会使用++i
。 但不是因为它更高效:因为它正确地表达了我的意图。
更好的答案是, ++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++
,并且结果不受影响,这仍然是一种好习惯。
上一篇: Is there a performance difference between i++ and ++i in C?