【问题标题】:what is use of inline keyword in delphidelphi中的内联关键字有什么用
【发布时间】:2009-07-22 12:24:03
【问题描述】:

谁能说说delphi中inline关键字的用途

【问题讨论】:

    标签: delphi


    【解决方案1】:

    这是对编译器的一个提示,即函数/过程应该(如果可能的话)内联,即当你调用它时,它应该像宏一样扩展而不是被调用。

    这是对调用开销很大的(非常)小的函数的优化。您会在例如 windows.pas 中找到许多示例

    实际发生的情况取决于函数的复杂性、公共/私人访问权限和您的 Delphi 版本。

    【讨论】:

    • 真的是编译器负责这个指令吗?我尝试使用Borland Delphi Version 15.0 编译单元,但找不到内联指令。
    • 内联是 D2005+,但自 D2006 iirc 起只能跨单元工作。是的,编译器做到了。它也不是真的像一个宏(内联在源代码级别上不起作用,而是在解析后在生成的代码级别上更深一层)
    • D7 是否支持内联关键字?我收到消息:[Error] RegExpr.pas(4155): Declaration expected but 'INLINE' found ... when using RegExpr library.
    • @user1141649 否。Delphi 7 不支持内联函数。您需要 Delphi 2005 或更新版本。
    【解决方案2】:

    它告诉编译器在调用它的地方为 inline; 例程生成代码,而不是跳转到例程并返回。

    对于转换为非常短的汇编程序的过程,这可能对性能有好处,因为与参数准备、实际调用和过程序言/结尾相比,实际代码相对较短。

    如果过程太长,它可能会影响性能,并极大地破坏您的代码。 “自动”设置应该为您做出这个决定,但在特定情况下,您可以在本地将 {$inline 设置为 on 以强制它。 (例如,对于转换为 pascal 函数的 C 宏,例如用于处理比特流的 zlib 函数)

    【讨论】:

    • 那么,如果我在函数体内使用 {$Inline on} ,它是否仅适用于该函数?还是我必须在函数结束时调用 OFF?
    • 它为编译单元(单元或主程序)的其余部分设置一个标志,以内联函数标记为 inline 指令。要关闭标志,您需要将其关闭。
    【解决方案3】:

    其他人已经回答了 inline 的作用,但我只想指出,有一个编译器选项可以将 inline 设置为开、关或自动。查看 D2009 文档中的“调用过程和函数”以获得对内联机制的非常好的解释。这是在线文档的链接:

    Delphi Online Docs for inline

    【讨论】:

    • Within a unit, the body for an inline function should be defined before calls to the function are made. Otherwise, the body of the function, which is not known to the compiler when it reaches the call site, cannot be expanded inline. 那个救了我的人。
    【解决方案4】:

    它是从 C 中借来的,它告诉编译器这是一个经常被调用的短例程,它建议编译器将函数视为宏,并在调用点将函数代码直接集成到程序中,而不是使用函数调用。

    这提供了更快的代码,因为没有函数调用开销,但是以更大的程序为代价。还要注意,就像在 C 中一样,这是对编译器的建议,它实际上不必这样做,优化器可能会覆盖你。

    在哪里执行此操作?就像循环展开一样,它是一种如今很少使用的技术。使用它的经典地方是嵌套结构的深处,该结构对实时至关重要,例如在图形应用程序中渲染代码,在每次迭代中减少一些机器调用可以提高屏幕刷新率。

    【讨论】:

    • D2005 内联就是您所描述的。 Delphi 2006+ inline 可以内联交叉编译单元,而无需在头文件中完全声明函数。这要困难得多,而且 C 标准无法做到这一点(尽管某些全局优化系统会尝试)
    【解决方案5】:

    在 Delphi 中调试时按 Ctrl + Alt + C(整个 CPU 调试窗口),然后调用内联函数。你会看到内联函数在没有“调用”的情况下开始并跳转到另一个地址。它的优化功能。

    【讨论】:

    • 你能改一下你的分析器吗?很难理解。
    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2010-12-16
    • 2011-02-03
    相关资源
    最近更新 更多