您好,
哪种更好,更快,更优化的方式来实现无限循环 - for(;;)或while(1)?为什么?
答案 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指令。