while(1) 与for(;;) 的区别

在编程中,我们常常需要用到无限循环,常用的两种方法是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

int main()

{

   for(;;);

  return 0;

}

先看while.c

int main()

{

   while(1);

  return 0;

}

用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

  • 4
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值