为了账号安全,请及时绑定邮箱和手机立即绑定

C中的I+和+i之间是否存在性能差异?

C中的I+和+i之间是否存在性能差异?

C
动漫人物 2019-07-09 16:41:56
C中的I+和+i之间是否存在性能差异?..i++和++i如果没有使用结果值?
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

执行摘要:否。

i++可能比++i,因为旧的价值i可能需要保存以供以后使用,但在实践中,所有现代编译器都将对此进行优化。

我们可以通过查看此函数的代码来演示这一点,++ii++.

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

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

文件是相同的,除了++ii++:

$ 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


查看完整回答
反对 回复 2019-07-09
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

从…效率与意图安德鲁·科尼格:

首先,我们还不清楚++ii++,至少在涉及整数变量的情况下。

以及:

因此,我们应该问的问题不是这两种操作中哪一种更快,而是这两种操作中哪一种更准确地表达了您想要完成的任务。我认为,如果您不使用表达式的值,则永远不会有使用该表达式的理由。i++而不是++i,因为从来没有理由复制变量的值,增加变量,然后丢弃副本。

因此,如果没有使用结果值,我将使用++i..但这并不是因为它更有效率,而是因为它正确地陈述了我的意图。


查看完整回答
反对 回复 2019-07-09
?
哔哔one

TA贡献1854条经验 获得超8个赞

更好的答案是++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++结果不受影响的地方。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信