每个人都喜欢他们的微观优化,但据我所知,这不会产生任何影响。我在 Intel 处理器上使用 g++ 编译了两个变体,没有任何花哨的优化,结果是
for(int i = 0; i < 5; i++)
movl $0, -12(%ebp)
jmp L2
L3:
leal -12(%ebp), %eax
incl (%eax)
L2:
cmpl $4, -12(%ebp)
jle L3
for(int i = 0; i != 5; ++i)
movl $0, -12(%ebp)
jmp L7
L8:
leal -12(%ebp), %eax
incl (%eax)
L7:
cmpl $5, -12(%ebp)
jne L8
I think jle https://www.aldeid.com/wiki/X86-assembly/Instructions/jle and jne https://www.aldeid.com/wiki/X86-assembly/Instructions/jnz在大多数架构上应该转换为同样快速的指令。
所以为了性能,你不应该区分两者。总的来说,我同意第一种更安全,而且我也认为更常见。
编辑(2年后):由于这个话题最近再次引起了很多关注,我想补充一点,一般来说很难回答这个问题。哪些版本的代码更高效并没有明确定义C-标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf[PDF](这同样适用于 C++,可能也适用于 C#)。
5.1.2.3 程序执行
§1本国际标准中的语义描述描述了与优化问题无关的抽象机器的行为。
但可以合理地假设现代编译器将产生同样有效的代码,并且我认为只有在极少数情况下才会循环测试和计数表达成为for循环的瓶颈。
至于味道,我写的是
for(int i = 0; i < 5; ++i)