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

4

“使用内联函数有什么问题”和“递归函数可以是内联的吗”的讨论是否适用于Delphi内联函数?此外,有人知道如何处理Delphi中的递归内联函数吗?

1个回答

10

我猜可能不行,因为inline只是一种建议,但让我们来验证一下。

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

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中。


感谢您的好回答。关于“在Delphi 2009中”,我查看了我的Delphi 7 Object Pascal参考资料,显然inline一直是一个向前兼容的关键字,只是当时没有起作用。 - Peter Turner
好像我也记得有一段时间看到过它。 - Jim McKeeth
1
“Inline”曾经是将机器码直接放入函数中的方法。现在,您只需使用“asm”块,如果您需要编译器不知道的指令,则可以使用DB、DW和DD指令插入字节。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接