while(1)死循环与for(;;)死循环的区别
引言:
单片机的编程中经常用到
while(1)
死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到
for(;;)
作为死循环的条件。
两者区别:
区别一:for式死循环更加高效一点
for(;;)
死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体,不用进行判断。
while(1)
死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。
即,相对来说for式死循环更加高效一点,当然以上条件成立还要看编译器的优化,一些编译器优化的两者并无区别,但是,并非所有的编译器都做了这样的优化。
所以在开启多线程时,while(1)和for(;;)区别会体现出来,前者存在判断环节,导致线程之间出现运行差别。for(;;)则不会影响,理论上线程会保持同时运行。
区别二:编译出的程序代码大小不同
同样的代码,编译出的程序代码大小不同。
编译前 编译后
while (1); mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
编译前 编译后
for (;;); jmp foo+23h
由上面的结果可以看出:
for编译器会优化成一条汇编指令,而while编译器会有很多条汇编指令
结果:
for ( ; ; )1.指令少,不占用寄存器,省内存;2.而且没有判断、跳转
参考:
【C语言天天练(一)】while(1)死循环与for(;;)死循环的区别
总结 for(;😉 比 while(true) 好