我是靠谱客的博主 腼腆火,最近开发中收集的这篇文章主要介绍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 (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码:

编译前:

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

最后

以上就是腼腆火为你收集整理的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 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部