• Delphi XE4 inline 的用法


    为了提高应用程序的性能,可以用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

  • 相关阅读:
    Java8简明教程(转载)
    Android开源代码分享
    Android关联源码support-v4的问题解决
    自定义控件的自定义的属性attrs.xml下的declare-styleable中format详解
    获得 LayoutInflater 实例的三种方式
    退出telnet
    Relay log read failure
    MySQL --log-slave-updates
    MySQL --slave-skip-errors
    MySQL 5.1.63 单机配置多实例(简单配置)
  • 原文地址:https://www.cnblogs.com/jijm123/p/15821232.html
Copyright © 2020-2023  润新知