for和while的使用,直接举例子就可以。
一.以VS为例,这里用的是VS2013;
int i;
for(i = 0;i<10;i++)
{
}
int i = 0;
while(i<10)
{
i++;
}
从代码上没法看到更多的东西,干脆直接看汇编。
int i = 0;
008E139E mov dword ptr [i],0
for (;i<10;i++)
008E13A5 jmp main+30h (08E13B0h)
008E13A7 mov eax,dword ptr [i]
008E13AA add eax,1
008E13AD mov dword ptr [i],eax
008E13B0 cmp dword ptr [i],0Ah
008E13B4 jge main+38h (08E13B8h)
{
}
008E13B6 jmp main+27h (08E13A7h)
return 0;
008E13B8 xor eax,eax
int j = 0;
001D17AE mov dword ptr [j],0
while (j<10)
001D17B5 cmp dword ptr [j],0Ah
001D17B9 jge main+36h (01D17C6h)
{
j++;
001D17BB mov eax,dword ptr [j]
001D17BE add eax,1
001D17C1 mov dword ptr [j],eax
}
001D17C4 jmp main+25h (01D17B5h)
return 0;
001D17C6 xor eax,eax
1.这里的汇编代码都是比较简单的,很明显我们在DEBUG下生成的汇编中,
也就执行一次,所以是几乎没时间差。
2.对VS进行了设置,查看了一下release下的汇编指令,发现个DEBUG下
产生的一毛一样,并没有什么优化。
二.以GCC_4.8.2测试
5 int i = 0;
0x080483f6 <+6>: movl $0x0,-0x4(%ebp)
6 for(;i<10;i++)
=> 0x080483fd <+13>: jmp 0x8048403 <main+19>
0x080483ff <+15>: addl $0x1,-0x4(%ebp)
0x08048403 <+19>: cmpl $0x9,-0x4(%ebp)
0x08048407 <+23>: jle 0x80483ff <main+15>
7 {
8 }
9
10 return 0;
0x08048409 <+25>: mov $0x0,%eax
5 int i = 0;
=> 0x080483f6 <+6>: movl $0x0,-0x4(%ebp)
6 while(i<10)
0x080483fd <+13>: jmp 0x8048403 <main+19>
0x08048403 <+19>: cmpl $0x9,-0x4(%ebp)
0x08048407 <+23>: jle 0x80483ff <main+15>
7 {
8 i++;
0x080483ff <+15>: addl $0x1,-0x4(%ebp)
9 }
10
11 return 0;
0x08048409 <+25>: mov $0x0,%eax
这里直接用gcc不加任何优化产生的汇编,很明显,在gcc编译器下,
for和while没有任何差别。较VS相比,可能gcc自己默认的-O0优化产生的差异。
同样这两个也是我们经常讨论的。
2.1 在VS环境下,汇编上while就比for多了个给寄存器传值并测试指令(对1传给寄存器并测试
寄存器空不空),所以论循环的话,同样没差别。
2.2在gcc环境下,两者产生的汇编代码一毛一样(就循环汇编,不包括其他汇编),没差别。
所以,在我们考虑选用for还是while的时候,除了根据自身需求之外,再就是编译器的选择了。
for(;;)
{
}
while(1)
{
}