在C中,i ++和++ i之间区别是什么?

  • 回答 (2)
  • 关注 (0)
  • 查看 (87)

是否有性能差异i++,++i如果不使用结果值?

chen313chen313提问于
akjok54stay hungry stay foolish回答于

答案是,++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++结果不受影响的习惯仍然是一个好习惯。

人生的旅途辣鸡前端回答于

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

所属标签

可能回答问题的人

  • 学生

    3 粉丝476 提问7 回答
  • uncle_light

    5 粉丝518 提问6 回答
  • 最爱开车啦

    8 粉丝503 提问5 回答
  • 骑牛看晨曦

    4 粉丝522 提问5 回答

扫码关注云+社区

领取腾讯云代金券