Delphi 2009 编译器如何处理递归内联方法?

发布于 2024-07-16 01:34:08 字数 265 浏览 4 评论 0原文

执行“使用内联函数有什么问题”和“递归函数可以内联”适用于Delphi内联函数吗? 此外,有谁知道Delphi中如何处理递归内联函数?

Do "What's wrong with using inline functions" and "Can a recursive function be inline" apply to Delphi inline functions? Furthermore, does anyone know how recursive inline functions are handled in Delphi?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

疧_╮線 2024-07-23 01:34:08

我的猜测可能不是,因为内联只是一个建议,但让我们找出答案。

一个简单的递归阶乘例程:

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,$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 

它们对我来说都是一样的,所以我将坚持我最初的假设并说它们不被支持。

顺便说一句:这是 Delphi 2009 中的内容。

My guess is probably not since inline is only a suggestion, but lets find out.

A simple recursive factorial routine:

function Factorial(const aNum: cardinal): cardinal;
begin
  if aNum > 1 then
    Result := Factorial(aNum - 1) * aNum
  else
    Result := 1;
end;

Here is the disassembly of the call to it:

// fact := Factorial(5);
mov eax,$00000005
call Factorial
mov ebx,eax

And the disassembly of the routine itself:

// 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 

Now we make it inline and see what is different in the call:

// 21: fact := Factorial(5);
mov eax,$00000005
call Factorial
mov ebx,eax

And the routine itself:

// 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 

And they both appear the same to me, so I am going to stick with my original hypothesis and say they are not supported.

BTW: this is in Delphi 2009.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文