概述
在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码:
编译前:
while (1);
编译后:
mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
编译前:
for (;;);
编译后:
jmp foo+23h
显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。这是因为以前的编译器对这两种无线循环的编译处理不一致造成的。
三、 现代编译器(gcc-4.1.1-52-e15)对这两种无线循环的影响?
先看for.c
{
}
先看while.c
int main()
{
}
用gcc编译
gcc –g –c for.c –o for.o
gcc –g –c while.c –o while.o
objdump –j .text –Sl while.o > while.txt
objdump –j .text –Sl for.o > for.txt
结果从汇编来看,for(;;)和while(1)的汇编代码都是
4 : eb fe jmp 4
结论是:它们的汇编指令都是一样的,所以效率也是一样的
单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。
两者区别:
区别一
for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。
while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。
区别二
for.c源码:
include
include
最后
以上就是腼腆火为你收集整理的while(1) 与for(;;) 的区别gcc –g –c for.c –o for.ogcc –g –c while.c –o while.oobjdump –j .text –Sl while.o > while.txtobjdump –j .text –Sl for.o > for.txtinclude include 的全部内容,希望文章能够帮你解决while(1) 与for(;;) 的区别gcc –g –c for.c –o for.ogcc –g –c while.c –o while.oobjdump –j .text –Sl while.o > while.txtobjdump –j .text –Sl for.o > for.txtinclude include 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复