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

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

在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码: 编译前: while (1); ...
  • nh5431313
  • nh5431313
  • 2017-03-30 08:41:25
  • 2016

C/C++之for(;;)与while(1)的区别

一般for(;;)性能更优 for(;;)  {}  这两个;; 空语句,编译器一般会优掉的,直接进入死循环 while(1)  {}  每循环一次都要判断常量1是不是等于零,在这里while比for...
  • qq_35057840
  • qq_35057840
  • 2016-09-09 16:53:54
  • 474

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

1.for(;;) 与 while(true) 的 区别
  • baidu_29029173
  • baidu_29029173
  • 2016-04-17 22:13:29
  • 3165

for(;;)和while(1)两种死循环的区别

有些编译器在写程序时会自动生成死循环代码,大多是使用for形式的,我们自己写程序,经常用的while(1),所以有些不解,查询网络后得出以下结论 即 for(;;)和while(1)两种死循环的区别...
  • ysudykx
  • ysudykx
  • 2017-02-16 22:46:11
  • 1443

for循环与while循环的区别和联系

(一)相同点: C/C++中的for循环代码和while循环代码在GCC中生成的汇编代码在经过优化之后是相同的。即,两者在表达能力上是等价的。 (二)不同点 1.循环条件 for循环的循环条件一般是循...
  • UUUUTaossienUUUU
  • UUUUTaossienUUUU
  • 2016-02-24 15:39:56
  • 1420

while(1)和for(;;)两个死循环有什么区别

一般for(;;)性能更优 for(;;)   {} 复制代码 这两个;; 空语句,编译器一般会优掉的,直接进入死循环 while(1)   {...
  • ljb825802164
  • ljb825802164
  • 2016-01-09 21:21:30
  • 3860

关于for(;;)和while(1)/while(true)区别

网传前者效率稍高,至少从汇编级看如此。但从我的编译器看二者是一样的,所以这个东西应该是与编译器高度相关的,保守点讲前者至少不会差于后者。 试验如下: g++版本4.8.2,c++代码如下: ...
  • u012369789
  • u012369789
  • 2015-12-23 14:09:06
  • 788

无限循环 while(1) 和 for(; ;) 有何区别?哪个更好?

无限循环有两种常用的方法: while(1) 和 for(; ; ) 。 两种方法的效果一样,相比之下,哪种更好些? 编译后代码对比: 1、while( 1 ); 00401028 mov ...
  • hzhsan
  • hzhsan
  • 2013-12-10 17:00:24
  • 5476

关于 while(1)和for(;;)效率问题的一点想法

这几天看到好友的文章关于while(1)和for(;;)效率的讨论,手痒说了两句。回头一寻思,自己也只是推断。没有做任何实验,我们就看看这两种写法到底有什么区别: 实验环境:IAR EWAR...
  • coolbacon
  • coolbacon
  • 2012-04-17 13:39:49
  • 23234

Linux中循环语句while和until的区别

1 while【满足条件就执行】 #!/bin/bash sum=0 i=1; #当i while [ $i -le 100 ]         do                 sum=$...
  • woshixuye
  • woshixuye
  • 2016-09-26 09:37:01
  • 1317
收藏助手
不良信息举报
您举报文章:while(1) 与for(;;) 的区别
举报原因:
原因补充:

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