Delphi 2009编译器如何处理递归内联方法?
发布时间:2020-12-15 09:37:24 所属栏目:大数据 来源:网络整理
导读:“ What’s wrong with using inline functions”和“ Can a recursive function be inline”是否适用于Delphi内联函数?此外,有谁知道如何在Delphi中处理递归内联函数? 解决方法 我的猜测可能不是因为内联只是一个建议,但让我们找出答案. 一个简单的递归阶
“
What’s wrong with using inline functions”和“
Can a recursive function be inline”是否适用于Delphi内联函数?此外,有谁知道如何在Delphi中处理递归内联函数?
解决方法
我的猜测可能不是因为内联只是一个建议,但让我们找出答案.
一个简单的递归阶乘例程: function Factorial(const aNum: cardinal): cardinal; begin if aNum > 1 then Result := Factorial(aNum - 1) * aNum else Result := 1; end; 这是对它的调用的反汇编: // fact := Factorial(5); mov eax,$00000005 call Factorial mov ebx,eax 并且例程本身的反汇编: // 9: begin push ebx mov ebx,eax // 10: if aNum > 1 then cmp ebx,$01 jbe $0040ab30 // 11: Result := Factorial(aNum - 1) * aNum mov eax,ebx dec eax call Factorial imul ebx pop ebx ret // 13: Result := 1; 0040ab30: mov eax,$00000001 // 14: end; pop ebx ret 现在我们将其内联并查看调用中的不同之处: // 21: fact := Factorial(5); mov eax,eax 例程本身: // 9: begin push ebx mov ebx,ebx dec eax call Factorial imul ebx pop ebx ret // 13: Result := 1; 0040ab30: mov eax,$00000001 // 14: end; pop ebx ret 它们对我来说都是一样的,所以我会坚持原来的假设并说它们不受支持. 顺便说一下:这是在Delphi 2009中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |