最好的无限循环

时间:2010-08-17 18:37:15

标签: c optimization loops infinite

  

可能重复:
  while (1) Vs. for (;;) Is there a speed difference?

您好,

哪种更好,更快,更优化的方式来实现无限循环 - for(;;)或while(1)?为什么?

6 个答案:

答案 0 :(得分:46)

我更喜欢for(;;),因为它不会测试任何东西,从语义上来说这就是你的意思。如果1为真,那么继续测试没有多大意义。但是,任何专业的C程序员都应该立即识别这两种惯用语。

就实际表现而言,应该没有区别。编译器将优化测试。

我试过测试两者哪个更快,但它们都没有完成。

答案 1 :(得分:17)

在任何正常的编译器中,应该绝对没有区别。例如,以下为LLVM-clang -O3生成while (1) {}标记的内容{/ 1}}:

    .file   "test.c"
    .text
    .globl  main
    .align  16, 0x90
    .type   main,@function
main:
    pushl   %ebp
    movl    %esp, %ebp
    .align  16, 0x90
.LBB0_1:
    jmp .LBB0_1

注意jmp .LBB0_1部分,这是实际的无限循环。对于for (;;)种类,它会生成完全相同的代码

您也可以尝试与其他编译器一起玩,但最好不要担心它。


好的,我只需要尝试gcc

    .file   "test.c"
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
.L2:
    jmp .L2

答案 2 :(得分:4)

我认为两者都不会更优化,因为它们都无法在任何可测量的时间内完成无限循环的任务。

是否真的有可能或多或少地达到无穷大?

答案 3 :(得分:2)

理论上,完全天真的编译器可以将文字“1”存储在二进制文件中(浪费空间)并检查每次迭代是否1 == 0(浪费时间和更多空间)。

然而,实际上,即使采用“不”优化,编译器仍然会将两者都降低到相同的水平。它们也可能会发出警告,因为它可能表示存在逻辑错误。例如,while的参数可以在其他地方定义,但你没有意识到它是恒定的。

答案 4 :(得分:0)

这是我的意见(没有做过研究):

当我逐步调试代码时,对于for循环,它让我第一次进入所有三个部分,然后是其余两个迭代。但是,while循环只有一个。只是一个想法。

答案 5 :(得分:0)

同样的事情。编译器会将其转换为单个JMP指令。