为什么visualstudio将i++后增量作为自动完成循环的默认值



所以这就是visualstudio在自动完成for循环时提供的功能。有人告诉我,++I比I++更有效,因为预增量不需要编译器创建一个临时变量来存储I。我应该使用++I,除非我真的需要I++。视觉工作室默认这样做有什么原因吗?还是我想得太多了?

for (size_t i = 0; i < length; i++)
{
}

这个答案有些是基于我的经验,而不是任何确凿的事实,所以请对此持怀疑态度。

i++作为默认循环增量的原因

后缀与前缀

后缀增量器i++生成一个临时的预增量值,该值在表达式中"向上"传递,然后变量i随后递增。

前缀incremetor++i不产生临时对象,而是直接递增i,并将递增的结果传递给表达式。

性能

看看两个简单的循环,一个使用i++,另一个使用++i,让我们检查生成的汇编

#include <stdio.h>
int main()
{ 
for (int i = 0; i < 5; i++) {
//        
}
for (int j = 0; j < 5; ++j) {
//
}

return 0;
}

使用GCC生成以下程序集:

main:
push    rbp
mov     rbp, rsp
mov     DWORD PTR [rbp-4], 0
.L3:
cmp     DWORD PTR [rbp-4], 4
jg      .L2
add     DWORD PTR [rbp-4], 1
jmp     .L3
.L2:
mov     DWORD PTR [rbp-8], 0
.L5:
cmp     DWORD PTR [rbp-8], 4
jg      .L4
add     DWORD PTR [rbp-8], 1
jmp     .L5
.L4:
mov     eax, 0
pop     rbp
ret

L3对应于第一环路,而L5对应于第二环路。在这种情况下,编译器会优化掉任何差异,从而产生相同的代码,因此没有性能差异。

外观

看看下面的三个循环,哪一个最吸引你?

for (int i = 0; i < 5; i++) {
//        
}
for (int i = 0; i < 5; ++i) {
//
}
for (int i = 0; i < 5; i+=1) {
//
}

对我来说,i+=1是正确的,++我只是觉得有点向后

人体工程学

  • i++(-你的手已经在正确的位置打字了(++
  • ++i( -需要从上排移动到本垒和后排

历史

较老的C程序员和当前编写系统级代码的C程序员经常使用i++来编写非常紧凑的代码,例如:

// print some char * s
while(*s)
putc(*s++);
// strcpy from src to dest
while (*dest++=*src++);

正因为如此,i++成为了C程序员最先达到的增量,最终成为++i与i++功能相同的情况下的一种标准。

选择++i只会有一个样式选择。

在这种情况下,没有任何业绩增长。这是一个神话。

对于ints上的简单循环,i++也更"传统"。

你当然可以自由地用自己的风格写自己的循环!

最新更新