你好,
实现无限循环的更好、更快和更优化的方法 - for(;;) 还是 while(1)?为什么?
我更喜欢for(;;)
它,因为它不测试任何东西,从语义上讲,这就是你的意思。如果 1 为真,继续测试没有多大意义。然而,任何专业的 C 程序员都应该立即认出这两个习语,因为它们都被使用了。
就实际性能而言,应该没有区别。编译器将优化测试。
我尝试测试两者以查看哪个更快,但它们都没有完成。
在任何普通的编译器中,应该绝对没有区别。例如,这是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
我认为两者都不是更优化的,因为两者都不会在任何可测量的时间内完成无限循环的任务。
真的有可能或多或少有效地达到无穷大吗?
理论上,一个完全幼稚的编译器可以将文字“1”存储在二进制文件中(浪费空间)并检查每次迭代是否 1 == 0(浪费时间和更多空间)。
然而,实际上,即使“没有”优化,编译器仍然会将两者减少到相同。它们也可能发出警告,因为它可能指示逻辑错误。例如,while 的参数可以在其他地方定义,而您没有意识到它是常量。
一样。编译器会将其转换为单个 JMP 指令。
这是我的观点(没有研究):
当我逐步调试代码时,for循环让我第一次进入所有三个部分,然后是其余的两个迭代。然而,while 循环只有一个。只是一个想法。