【问题标题】:How does the Delphi 2009 compiler handle recursive inline methods?Delphi 2009 编译器如何处理递归内联方法?
【发布时间】:2010-10-17 22:08:04
【问题描述】:

What's wrong with using inline functions”和“Can a recursive function be inline”是否适用于 Delphi 内联函数?此外,有谁知道在 Delphi 中如何处理递归内联函数?

【问题讨论】:

    标签: delphi recursion delphi-2009 inline-method


    【解决方案1】:

    我的猜测可能不是因为 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 长期以来一直是向前兼容的关键字,它当时从未做过任何事情。
    • 好像我记得不久前也看过。
    • “内联”曾经是您将原始机器代码放入函数的方式。现在您只需使用“asm”块,如果您想要编译器不知道的指令,您可以使用 DB、DW 和 DD 指令插入字节。
    猜你喜欢
    • 2011-07-12
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多