Delphi - 循环的秘密

本文通过Delphi编译器生成的反汇编代码,详细解析了for、do-while三种循环结构的实现方式及其效率对比。通过对具体代码示例的分析,展示了Delphi如何高效地处理不同类型的循环。

======================================================
注:本文源代码点此下载
======================================================

技术交流,dh讲解.

哈哈,我承认我是标题党.

最近看天书夜读里面是对c语言的代码反汇编,不错,可惜delphi没有这样的书,那我们自己动手吧.

首先进入for循环了.

function testfor( a, b: integer ): integer ;

var

i: integer ;

begin

result := a + b ;

for i := 0 to 49 do

result := result + i ;

end ;

{$r *.dfm}

procedure tform1.btn1click( sender: tobject ) ;

begin

showmessage( inttostr( testfor( 1, 2 ) ) ) ;

end ;

反汇编代码:

unit4.pas.28: result := a + b ;

00523ae0 03d0add edx,eax //执行a+b,但是我很奇怪为什么不用add eax,edx 这样最后就不用执行那句mov eax,edx了,节约一句

unit4.pas.29: for i := 0 to 49 do

00523ae2 33c0xor eax,eax //清除eax,来充当i这个循环变量

unit4.pas.30: result := result + i ;

00523ae4 03d0add edx,eax //累计和,并把循环变量+1,这里就是循环体的执行代码

00523ae6 40inc eax

unit4.pas.29: for i := 0 to 49 do

00523ae7 83f832cmp eax,$32 //边界比较,不等于就跳回去,继续执行循环体代码.

00523aea 75f8jnz $00523ae4 //看来还是再写个函数来看看

unit4.pas.31: end ;

00523aec 8bc2mov eax,edx

00523aee c3ret

对比书中c的反汇编代码,delphi反汇编出来的代码很精简,虽然声明了局部变量,但是函数直接用寄存器代替了.很好.

书中c循环体先直接用jmp跳过去与临界变量比较,然后再来看是否执行循环体,而改变循环变量它用了add eax,1,然后再把eax传给栈上面的i.

后来我尝试改成0 to -1 delphi编译器会识别出来,然后不会添加任何循环代码到函数中去的.

接下来是do循环,也就是repeat

function testrepeat(a,b:integer):integer ;

var

i:integer;

begin

result:=a + b;

i:=0;

repeat

result:= result + i;

inc(i);

until i = 50;

end;

反汇编代码:

unit4.pas.30: result:=a + b;

00523ae0 03d0add edx,eax

unit4.pas.31: i:=0;

00523ae2 33c0xor eax,eax

unit4.pas.33: result:= result + i;

00523ae4 03d0add edx,eax

unit4.pas.34: inc(i);

00523ae6 40inc eax

unit4.pas.35: until i = 50;

00523ae7 83f832cmp eax,$32

00523aea 75f8jnz $00523ae4

unit4.pas.36: end;

00523aec 8bc2mov eax,edx

00523aee c3ret

我们发现反汇编代码和for是一样的.

这段代码就和vc反编译出来的差不多了,先执行循环体然后再比较边界.

好,看看while呢?

function testwhile(a, b: integer): integer;

var

i: integer;

begin

result:= a+ b;

i:= 0;

while i

反汇编代码:

unit4.pas.38: result:= a+ b;

00523ae0 03d0add edx,eax

unit4.pas.39: i:= 0;

00523ae2 33c0xor eax,eax

unit4.pas.42: result:= result+ i;

00523ae4 03d0add edx,eax

unit4.pas.43: inc(i);

00523ae6 40inc eax

unit4.pas.40: while i

我晕,居然还是一样的.也就是delphi里面3种循环执行效率是一样的吧.

而vc同样是先初始化循环变量,然后无条件跳转到边界检测,然后才执行循环体代码.

循环就这么多,以后该是条件判断

绿色通道:好文要顶关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值