在“for”循环中按 1 递增时格式化背后的技术原因?

2022-08-31 19:40:05

在整个 Web 中,代码示例都有如下所示的循环:for

for(int i = 0; i < 5; i++)

而我使用以下格式:

for(int i = 0; i != 5; ++i)

我这样做是因为我相信它更有效率,但在大多数情况下这真的重要吗?


答案 1

每个人都喜欢他们的微优化,但据我所知,这不会有什么不同。我为英特尔处理器编译了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

我认为jlejne应该转化为大多数架构上同样快速的指令。因此,对于性能,您不应区分两者。总的来说,我同意第一个更安全,我也认为更常见。


编辑(2年后):由于这个帖子最近再次引起了很多关注,我想补充一点,一般很难回答这个问题。C-Standard [PDF]没有明确定义哪些版本的代码更有效(这同样适用于C++可能也适用于C#)。

第5.1.2.3节 程序执行

第 1 条本国际标准中的语义描述描述了抽象机器的行为,其中优化问题无关紧要。

但是,可以合理地假设现代编译器将生成同样高效的代码,我认为只有在极少数情况下,循环测试和计数表达式才会成为for循环的瓶颈。

至于味道,我写

for(int i = 0; i < 5; ++i)

答案 2

如果由于某种原因在循环中跳到50,您的版本将永远循环。这是一个健全性检查。ii < 5