6

可能重复:
while (1) Vs. for (;;) 有速度差异吗?

你好,

实现无限循环的更好、更快和更优化的方法 - for(;;) 还是 while(1)?为什么?

4

6 回答 6

49

我更喜欢for(;;)它,因为它不测试任何东西,从语义上讲,这就是你的意思。如果 1 为真,继续测试没有多大意义。然而,任何专业的 C 程序员都应该立即认出这两个习语,因为它们都被使用了。

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

我尝试测试两者以查看哪个更快,但它们都没有完成。

于 2010-08-17T18:38:55.213 回答
19

在任何普通的编译器中,应该绝对没有区别。例如,这是LLVM-clang生成(带有-O3标志)的内容while (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
于 2010-08-17T18:39:13.203 回答
4

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

真的有可能或多或少有效地达到无穷大吗?

于 2010-08-17T18:39:19.620 回答
2

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

然而,实际上,即使“没有”优化,编译器仍然会将两者减少到相同。它们也可能发出警告,因为它可能指示逻辑错误。例如,while 的参数可以在其他地方定义,而您没有意识到它是常量。

于 2010-08-17T18:42:01.137 回答
1

一样。编译器会将其转换为单个 JMP 指令。

于 2010-08-17T18:39:39.753 回答
0

这是我的观点(没有研究):

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

于 2010-08-17T18:39:27.920 回答