C/C++ 循环语句的优化

来源:互联网 发布:ubuntu软件安装 编辑:程序博客网 时间:2024/06/05 00:39

主题:for,do while,while的使用

C代码:

void test_for_and_while()
{
 int i, j = 0;

 for (i = 0; i<100; i++)
 {
  d_printf("");
 }
 for (i = 100; i>=0; i--)
 {
  d_printf("");
 }

 i=100;
 do
 {
  d_printf("");
 }while (--i);

 i = 0;
 do
 {
  d_printf("");
 }while (++i);

 i = 100;
 while (i--)
 {
  d_printf("");
 }

 i = 0;
 while (i++)
 {
  d_printf("");
 }
}

汇编代码:

Debug Version 循环100次
for   6
0044CA3E  mov         dword ptr [i],0
0044CA45  jmp         test_for_and_while+30h (44CA50h)
0044CA47  mov         eax,dword ptr [i]
0044CA4A  add         eax,1
0044CA4D  mov         dword ptr [i],eax
0044CA50  cmp         dword ptr [i],64h

do while
0044CA72  mov         dword ptr [i],64h
0044CA79  mov         eax,dword ptr [i]
0044CA7C  sub         eax,1
0044CA7F  mov         dword ptr [i],eax
0044CA82  jne         test_for_and_while+59h (44CA79h)

while
0044CA96  mov         dword ptr [i],64h
0044CA9D  mov         eax,dword ptr [i]
0044CAA0  mov         dword ptr [ebp-0D0h],eax
0044CAA6  mov         ecx,dword ptr [i]
0044CAA9  sub         ecx,1
0044CAAC  mov         dword ptr [i],ecx
0044CAAF  cmp         dword ptr [ebp-0D0h],0
0044CAB6  je          test_for_and_while+9Ah (44CABAh)

Release Version
for i++
004022C1  mov         esi,64h
004022C6  push        offset string "" (44725Fh)
004022CB  call        d_printf (403130h)
004022D0  add         esp,4
004022D3  sub         esi,1
004022D6  jne         test_for_and_while+6 (4022C6h) 

for i--
004022D8  mov         esi,64h
004022DD  lea         ecx,[ecx]
004022E0  push        offset string "" (44725Fh)
004022E5  call        d_printf (403130h)
004022EA  add         esp,4
004022ED  sub         esi,1
004022F0  jns         test_for_and_while+20h (4022E0h)

do while
004022F2  mov         esi,64h
004022F7  jmp         test_for_and_while+40h (402300h)
004022F9  lea         esp,[esp]
00402300  push        offset string "" (44725Fh)
00402305  call        d_printf (403130h)
0040230A  add         esp,4
0040230D  sub         esi,1
00402310  jne         test_for_and_while+40h (402300h)

我C代码里面++循环判断是错误的, --循环判断是正确的,可以看出do while,for,优胜于while,但是do while 和 for 不分上下的,而且在某些情况下要依赖于for中循环变量。

我的看法就是,大家不要太执着与这些细微的变化,除非你系统特殊需要,你可以通过改变代码来反汇编进行查看,到底选择哪种循环语句,不过是会很累的,呵呵。可能文章写的混乱,不过大家仔细研究的话肯定会得到独特的见解。