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

主题: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次
for6
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中循环变量。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值