我怀疑这个问题的答案与性能有很大关系。我用 c++ 编写了每个 for 循环的版本,并使用 GCC 来获得生成的 ASM。 “增强型 For 循环”(第 2 版)实际上比“非增强型 For 循环”多一条指令 subl $1, -8(%rbp)。
无论哪种方式,性能差异都可以忽略不计。这种代码选择应基于代码的可读性以及您是否希望将 for 循环内的操作应用于正向或反向的元素。 IE 从列表的开头或列表的结尾搜索。
for 循环的第一个版本:
int main(int argc, char* argv[])
{
int lengthOfSomething = 10;
int valueToInc = 0;
for(int i = 0; i < lengthOfSomething; i++)
{
valueToInc += i;
}
}
生成的 ASM
.file "main.cpp"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movl $10, -12(%rbp)
movl $0, -4(%rbp)
movl $0, -8(%rbp)
jmp .L2
.L3:
movl -8(%rbp), %eax
addl %eax, -4(%rbp)
addl $1, -8(%rbp)
.L2:
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
jl .L3
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.2 20140206 (prerelease)"
.section .note.GNU-stack,"",@progbits
for 循环的第二个版本:
int main(int argc, char* argv[])
{
int lengthOfSomething = 10;
int valueToInc = 0;
for(int i = lengthOfSomething - 1; i >= 0; i--)
{
valueToInc += i;
}
}
生成的 ASM
.file "main2.cpp"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movl $10, -12(%rbp)
movl $0, -4(%rbp)
movl -12(%rbp), %eax
subl $1, %eax
movl %eax, -8(%rbp)
jmp .L2
.L3:
movl -8(%rbp), %eax
addl %eax, -4(%rbp)
subl $1, -8(%rbp)
.L2:
cmpl $0, -8(%rbp)
jns .L3
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.2 20140206 (prerelease)"
.section .note.GNU-stack,"",@progbits