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

转载 2016年06月16日 23:59:43

一、 背景

今天在网上看到一篇blog,文章题目是《C代码优化方案》,其中有一节说到while(1)和for(;;)两种无线循环,哪种效率更高?

但是,在现代编译器上,其实两种无线循环效率都是一样的。

二、 以前为什么会出现for(;;)比while(1)的无线循环的效率高呢?

在《C代码优化方案》中,这样写道:

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

java零基础知识回顾(for与while的区别,以及for的一般用法)

java零基础知识回顾(for与while的区别,以及for的一般用法) 1.for与while的区别 for和while都可以表示循环,学习java零基础的教程,了解到for循环...
  • tantansinian
  • tantansinian
  • 2015年03月02日 09:30
  • 242

while(1);的作用

单片机中while(1)有两种用途, while(1); 意义:这是一个死循环,代码不再向下执行。 用途: 1. 一般在调试代码时,为了检测一部分代码是否OK,防止后面的代码干扰执行结果,会在...
  • a1232345
  • a1232345
  • 2014年12月02日 11:36
  • 8778

Python天坑系列(一):while 1比while True更快?

 0. 前言 前些天被Python的多线程坑了一把,因此产生了写一个《Python天坑系列》博客的想法,说说我碰到的那些Python的坑。 而天坑这个词呢,一方面指Python的坑,另一方面...
  • yongche_shi
  • yongche_shi
  • 2015年04月20日 16:25
  • 5200

单片机C语言中while(1)的问题

单片机C语言的主程序,通常要用一个while(1)语句来让程序进入一个无限循环,目的是为了让程序一直保持在我们需要运行的情况下。   虽然这种做法毋庸置疑,在网上还是有不少朋友有疑问,如果程序不加wh...
  • bytxl
  • bytxl
  • 2015年12月15日 17:21
  • 2996

for 循环和while循环区别

do-while循环 while循环 for循环 死循环选择for还是while  C语言提供了好几种循环结构,即while、for和do-while。汇编语言中并没有相应的指令存在,作为替代,将条件...
  • XscKernel
  • XscKernel
  • 2015年11月11日 15:59
  • 3241

为什么谷歌的JSON响应以while(1);开头?

问题(QUESTION):   我有个问题一直很好奇就是:为什么谷歌的JSON响应以while(1);开头?举个例子,当把谷歌日历打开和关掉时,会返回这样的JSON对象: while(1);[...
  • lqr801225
  • lqr801225
  • 2014年03月13日 10:07
  • 423

TMS320F28335项目开发记录7_28335之时钟

TMS320F28335上有一个基于PLL电路的片上时钟模块,为CPU及外设提供时钟有两种方式: 一种是用外部的时钟源,将其连接到X1引脚上或者XCLKIN引脚上,X2接地; 另一种是使用振荡器产生时...
  • scottly1
  • scottly1
  • 2014年11月05日 12:25
  • 2387

while 语句与 if 语句 for循环语句的循环

while 语句与 if 语句 for循环语句的循环
  • u011565547
  • u011565547
  • 2017年02月19日 22:25
  • 1306

分享一下PHP中的While循环函数,以前觉得挺难的

while循环的方法重复任务,只要拥有一定的条件。例如,您可能想要提示用户输入一个值,只要他们继续输入一个无效的。换句话说,while循环是非常有用的,当你不知道有多少次你想要执行的指令集。 如果你...
  • qihailei1118
  • qihailei1118
  • 2015年12月27日 17:52
  • 629

32位汇编语言学习笔记(9)--分析while循环的汇编代码

 while循环与do-while循环不同,是先判断循环条件。gcc会把while循环转换成如下格式的代码,再生成汇编代码: if (循环条件不成立) goto done ...
  • swordmanwk
  • swordmanwk
  • 2014年11月24日 20:44
  • 2178
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:while(1) 与for(;;) 的区别
举报原因:
原因补充:

(最多只允许输入30个字)