在C中,i ++和++ i之间有性能差异吗?

如果不使用结果值, i++++i之间是否存在性能差异?


内容提要:没有。

i++可能是慢++i ,因为旧的价值i可能需要被保存以备后用,但实际上所有的现代编译器将优化送人。

我们可以通过查看这个函数的代码来证明这一点,用++ii++

$ cat i++.c
extern void g(int i);
void f()
{
    int i;

    for (i = 0; i < 100; i++)
        g(i);

}

这些文件是相同的,除了++ii++

$ 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:

首先, ++ii++更有效率,至少在涉及整数变量的地方是远远不明显的。

和:

因此,人们应该问的问题不是这两个操作中的哪一个更快,而是这两个操作中的哪一个更准确地表达你正在尝试完成的操作。 我提出如果你没有使用表达式的值,那么从来没有理由使用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++ ,并且结果不受影响,这仍然是一种好习惯。

链接地址: http://www.djcxy.com/p/15213.html

上一篇: Is there a performance difference between i++ and ++i in C?

下一篇: Why does this work? Illogical array access