为了提高应用程序的性能,可以用inline声明一个函数过过程,对于声明为inline的过程,编译器在编译时,会取代正常的过程调用方式,取而代之是直接把这个函数的编译代码拿过来生成到调用该过程的地方,有多处调用一个函数,都直接在调用处插入函数的编译代码,这样的弊端,会生成较大的EXE文件。
声明的方法:
procedure MyFunc(x:integer):string;inline
有多种情况的函数或过程是不支持inline的:
- 后绑定的方法,如virtual,dynamic,message方法
- 包含汇编的过程
- Contructors与destructors方法
- The main program block, unit initialization, and unit finalization blocks cannot be inlined.
- Routines that are not defined before use cannot be inlined.
- 用开放数组为参数的过程,如:procedure Add(A: array of Integer)
- Package中支持inline,但Packages间不支持
- 循环引用的Unit间不支持inline,如a,b,c三个unit,a引用b,b引用c,c引用a,则编译时不生成inline代码,编译器在inline代码时,循环依赖的unit不编译出inline代码,但对于其中引用的unit,还是生成inline代码的,如在上面的例子中,如果A单元也采用了D单元,从单元D的代码可能会被内联,因为它不参与循环依赖。
- 如果一个过程定义在interface部分,实现代码在implementation部分,则不会inline
- while do 或 repeat until等中使用的过程
关于inline有三个编译条件变量可用:
{$INLINE ON}:支持inline指令,这是默认的
{$INLINE OFF}:关闭inline编译方式,不支持inline
{$INLINE AUTO}:自动支持inline,当inline on 时,对于32byte的过程自动进行inline.
参考: Delphi help Calling Procedures and Functions