你好,
在实现无限循环时,使用哪种方式更好、更快、更优化 - for(;;) 或 while(1)?为什么?
你好,
在实现无限循环时,使用哪种方式更好、更快、更优化 - for(;;) 或 while(1)?为什么?
我更喜欢使用for(;;)
,因为它不测试任何东西,从语义上讲这才是你的意思。如果1为真,反复测试没有多大意义。然而,任何专业的C程序员都应该能够立即识别两种习惯用法。
就实际性能而言,它们之间应该没有区别。编译器会优化掉测试。
我尝试测试两种方式以查看哪个更快,但它们都还没有完成。
在任何正常的编译器中,两者应该没有任何区别。比如说,这里是LLVM-clang
针对while (1) {}
使用-O3
标志生成的代码:
.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
我认为两者都不是更加优化的,因为两者都无法在任何可测量的时间内无限循环。
是否真的可能以更高效的方式达到无限大?
理论上,一个完全天真的编译器可以将文本 '1' 存储在二进制文件中(浪费空间),并检查每次迭代是否等于 0(浪费时间和更多空间)。
然而,在现实中,即使没有进行任何优化,编译器仍会将它们都简化为相同的结果。它们也可能会发出警告,因为这可能表明存在逻辑错误。例如,while 的参数可能在其他地方定义,而您可能没有意识到它是常量。
同样的事情。编译器会将其翻译为单个JMP指令。
这是我的观点(没有进行研究):
当我逐步调试代码时,对于for循环,第一次需要跳转到所有三个部分,然后在其余的迭代中只需要跳转两个部分。然而,while循环只有一个部分。这只是一个想法。