Delphi中的inline关键字有什么用处?

17

请问在Delphi中,inline关键字有什么用途呢?

5个回答

25

这是一种向编译器提示的方法,即该函数/过程(如果可能)应内联,即在调用它时应像宏一样展开,而不是被调用。

这是针对(非常)小型函数的优化,在这些函数中,调用的开销会很大。例如在 windows.pas 中有许多示例。

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


1
编译器真的会处理这个指令吗?我尝试使用“Borland Delphi Version 15.0”编译一个单元,但它找不到内联指令。 - Ben
内联是D2005+的,但只能在D2006之后跨单元工作,如果我没记错的话。是的,编译器会这样做。它也不像宏一样(内联不在源代码级别上工作,而是在解析后的生成代码级别上工作)。 - Marco van de Voort
1
D7是否支持inline关键字?我使用RegExpr库时收到以下消息:[Error] RegExpr.pas(4155): Declaration expected but 'INLINE' found ... - John Boe
1
@user1141649 不支持内联函数。您需要使用Delphi 2005或更新版本。 - Tom

13

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

对于转换为非常短汇编代码的过程,这可以提高性能,因为实际代码相对于参数准备、实际调用和过程序言/尾声来说相对较短。

但如果过程太长,则可能会拖慢性能,并使您的代码庞大无比。 "Auto"设置应该为您做出此决定,但在特定情况下,您可以将{$inline设为on以强制启用它。 (例如,用于处理位流的zlib函数等C宏翻译为Pascal函数的情况。)


那么,如果我在函数体内使用 {$Inline on},它只适用于该函数吗?还是我必须在函数末尾调用 OFF? - Gabriel
1
它为编译单元(单元或主程序)设置一个标志,以内联使用内联指令标记的函数。要关闭该标志,您需要将其关闭。 - Marco van de Voort

12

其他人已经回答了inline是什么,但我想指出编译器有一个选项可以设置为inline开启、关闭或自动。请查看"D2009文档"中的"调用过程和函数",那里有一个非常好的inline机制解释。以下是在线文档链接:

Delphi inline的在线文档


在一个单元内,在调用函数之前应该先定义函数的内联体。否则,在到达调用站点时编译器不知道函数的主体,因此无法将函数内联展开。他救了我一命。 - SAMPro

2
它来自于C语言,它告诉编译器这是一个经常调用的短例程,并建议编译器将函数视为宏并直接将函数代码集成到程序中,在调用点而不是使用函数调用。这样做可以提供更快的代码,因为没有函数调用开销,但代价是更大的程序。注意,像在C语言中一样,这只是对编译器的建议,它实际上不必这样做,优化器可能会覆盖你的建议。在哪里使用呢?就像循环展开一样,它现在很少使用。经典的使用场所是深度嵌套的实时关键结构,例如图形应用程序中的渲染代码,每次迭代少调用几个机器可以增加屏幕刷新率。

D2005的inline就是你所描述的。Delphi 2006+的inline可以内联跨编译单元,而无需在头文件中完全声明函数。这要困难得多,而且C标准通常无法做到(尽管某些全局优化系统会尝试)。 - Marco van de Voort

-1
在 Delphi 调试期间,在调用内联函数之前按下 Ctrl + Alt + C(整个 CPU 调试窗口),您将看到内联函数开始时没有“call”并且不会跳转到另一个地址。这是一项优化功能。

你能否重新表达一下你的答案?很难理解它。 - Gabriel

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