引子
今天在论坛中闲逛,看见一貌似很简单的问题
while(true)和forfor( ; ; )有区别吗,为什么C库源码中的都是for( ; ; )而不是while(true)
确实很简单的问题,可我确实不清楚,特此在网上查了一下 ,但是发现网上说法众说纷纭,经过查找资料,答案如下:
先抛答案
1、在C编译器中确实有区别,较之while( true ),for( ; ; ) 的效率更高一些
2、在java编译器中没有大的区别,看个人喜好和习惯而已
验证
C/C++
有如下代码:
int main()
{
int i;
i = 0;
for (;;)
{
i++;
}
i = 0;
while (true)
{
i++;
}
return 0;
}
如上图所示,左边是for( ; ; )的反汇编结果,右边是while(true)的反汇编结果,两者进行比较,会发现:while(true)比for( ; ; )多了几步操作,先将括号中的结果给寄存器,然后寄存进行比较,若比较结果为0则跳转到循环的结束执行其他操作
Java
同样的,对下面两段代码进行编译,得到的编译结果如注释所示:
public void foo() {
int i = 0;
while (true) { i++; }
}
/*
public void foo();
Code:
stack=1, locals=2, args_size=1
0: iconst_0
1: istore_1
2: iinc 1, 1
5: goto 2
*/
public void bar() {
int i = 0;
for (;;) { i++; }
}
/*
public void bar();
Code:
stack=1, locals=2, args_size=1
0: iconst_0
1: istore_1
2: iinc 1, 1
5: goto 2
*/
此时,会发现,编译器对这两个死循环的处理方式没有任何的不同,此时,就可以认为Java中while(true) 和 for( ; ; )是没有区别的
才疏学浅,若有不足之处,请您指正…