在“for”循环中按 1 递增时格式化背后的技术原因?
在整个 Web 中,代码示例都有如下所示的循环:for
for(int i = 0; i < 5; i++)
而我使用以下格式:
for(int i = 0; i != 5; ++i)
我这样做是因为我相信它更有效率,但在大多数情况下这真的重要吗?
在整个 Web 中,代码示例都有如下所示的循环:for
for(int i = 0; i < 5; i++)
而我使用以下格式:
for(int i = 0; i != 5; ++i)
我这样做是因为我相信它更有效率,但在大多数情况下这真的重要吗?
每个人都喜欢他们的微优化,但据我所知,这不会有什么不同。我为英特尔处理器编译了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
我认为jle
和jne
应该转化为大多数架构上同样快速的指令。因此,对于性能,您不应区分两者。总的来说,我同意第一个更安全,我也认为更常见。
编辑(2年后):由于这个帖子最近再次引起了很多关注,我想补充一点,一般很难回答这个问题。C-Standard [PDF]没有明确定义哪些版本的代码更有效(这同样适用于C++可能也适用于C#)。
第5.1.2.3节 程序执行
第 1 条本国际标准中的语义描述描述了抽象机器的行为,其中优化问题无关紧要。
但是,可以合理地假设现代编译器将生成同样高效的代码,我认为只有在极少数情况下,循环测试和计数表达式才会成为for循环的瓶颈。
至于味道,我写
for(int i = 0; i < 5; ++i)
如果由于某种原因在循环中跳到50,您的版本将永远循环。这是一个健全性检查。i
i < 5