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

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

..i++++i如果没有使用结果值?



动漫人物
浏览 396回答 3
3回答

拉莫斯之舞

执行摘要:否。i++可能比++i,因为旧的价值i可能需要保存以供以后使用,但在实践中,所有现代编译器都将对此进行优化。我们可以通过查看此函数的代码来演示这一点,++i和i++.$&nbsp;cat&nbsp;i++.cextern&nbsp;void&nbsp;g(int&nbsp;i);void&nbsp;f(){ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;100;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g(i);}文件是相同的,除了++i和i++:$&nbsp;diff&nbsp;i++.c&nbsp;++i.c6c6<&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;100;&nbsp;i++)--->&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;100;&nbsp;++i)我们将编译它们,并获得生成的汇编程序:$&nbsp;gcc&nbsp;-c&nbsp;i++.c&nbsp;++i.c $&nbsp;gcc&nbsp;-S&nbsp;i++.c&nbsp;++i.c我们可以看到,生成的对象和汇编程序文件都是相同的。$&nbsp;md5&nbsp;i++.s&nbsp;++i.s MD5&nbsp;(i++.s)&nbsp;=&nbsp;90f620dda862cd0205cd5db1f2c8c06eMD5&nbsp;(++i.s)&nbsp;=&nbsp;90f620dda862cd0205cd5db1f2c8c06e$&nbsp;md5&nbsp;*.o MD5&nbsp;(++i.o)&nbsp;=&nbsp;dd3ef1408d3a9e4287facccec53f7d22 MD5&nbsp;(i++.o)&nbsp;=&nbsp;dd3ef1408d3a9e4287facccec53f7d22

慕姐4208626

从…效率与意图安德鲁·科尼格:首先,我们还不清楚++i比i++,至少在涉及整数变量的情况下。以及:因此,我们应该问的问题不是这两种操作中哪一种更快,而是这两种操作中哪一种更准确地表达了您想要完成的任务。我认为,如果您不使用表达式的值,则永远不会有使用该表达式的理由。i++而不是++i,因为从来没有理由复制变量的值,增加变量,然后丢弃副本。因此,如果没有使用结果值,我将使用++i..但这并不是因为它更有效率,而是因为它正确地陈述了我的意图。

哔哔one

更好的答案是++i有时会更快但永远不会变慢。似乎每个人都认为i是一个常规的内置类型,如int..在这种情况下,不会有可衡量的差别。但是如果i是复杂的类型,那么你很可能会发现一个可衡量的差别。为i++在增量类之前,必须复制类的副本。根据副本中涉及的内容,它实际上可能会慢一些,因为++it您可以只返回最后的值。Foo&nbsp;Foo::operator++(){ &nbsp;&nbsp;Foo&nbsp;oldFoo&nbsp;=&nbsp;*this;&nbsp;//&nbsp;copy&nbsp;existing&nbsp;value&nbsp;-&nbsp;could&nbsp;be&nbsp;slow &nbsp;&nbsp;//&nbsp;yadda&nbsp;yadda,&nbsp;do&nbsp;increment &nbsp;&nbsp;return&nbsp;oldFoo;}另一个不同之处在于++i您可以选择返回引用而不是值。同样,根据创建对象副本所涉及的内容,这可能会慢一些。在现实世界中,这种情况可能发生的例子是迭代器的使用。复制迭代器不太可能成为应用程序的瓶颈,但养成使用++i而不是i++结果不受影响的地方。
打开App,查看更多内容
随时随地看视频慕课网APP