加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 未记录的内在例程

发布时间:2020-12-15 04:25:39 所属栏目:大数据 来源:网络整理
导读:Delphi有这个列表: Delphi Intrinsic Routines 但是这个列表是不完整的. 哪些无证的内在功能存在,因为他们的目的何时何地? 解决方法 我知道以下无证件的内在功能. 德尔福2007:here和Hallvard’s blog: 默认 function Default(T: Typeidentifier): value
Delphi有这个列表: Delphi Intrinsic Routines
但是这个列表是不完整的.

哪些无证的内在功能存在,因为他们的目的何时何地?

解决方法

我知道以下无证件的内在功能.

德尔福2007:here和Hallvard’s blog:

默认

function Default(T: Typeidentifier): value of T;

返回类型标识符T的零表示.

下面介绍了XE7中介绍的内在的in the XE7 beta blog和Stefan Glienke

IsManagedType

function IsManagedType(T: TypeIdentifier): Boolean;

如果T是接口,字符串或动态数组,或包含此类记录的记录,则为真.包含托管类型的类将返回false.

HasWeakRef

function HasWeakRef(T: TypeIdentifier): Boolean;

不确定它是做什么的,它只能在NextGen编译器中有用.

GetTypeKind

function GetTypeKind(T: TypeIdentifier): TTypeKind;

与PTypeInfo(System.TypeInfo(T))^.类似,但是因为它是一个编译器,内在的函数在compiletime中解析,并且评估为false的条件代码将被编译器剥离.

IsConstValue

function IsConstValue(const Value): Boolean;

如果Value是常数,则为True,否则为false.
这有助于编译器消除死代码,因为在编译时对该函数进行了评估.
这只适用于内联函数,它允许较短的生成代码.

所属类别

function TypeInfo(T: typeindentifier): PTypeInfo;

这个函数不是没有这样的文档,但是没有证明的是XE7是一个内在函数.
这意味着如果TypeInfo(T)= TypeInfo(byte)then …不会生成任何代码,如果T不是一个字节,并且测试将在compiletime解析,那么代码段.
但是,编译时解决方案仅在通用例程中工作,并且仅在执行if(TypeInfo(T)= TypeInfo(sometype))测试时才起作用.
测试如果TypeInfo(byte)= TypeInfo(smallint)然后不会被消除,即使它总是评估为false.
也不会使用TypeInfo(T).

退货地址

在returnaddress构造中使用以下引发异常.

function ReturnAddress(Expression): pointer;          //Delphi ?
function AddressOfReturnAddress(Expression): pointer; //Delphi ?

据我所知,你不能直接从用户代码中调用它们.

IsConstValue的示例

type
   TFlavor = (Tasty,Nasty);
   TIntegerHelper = record helper for integer
     function GetSomething(Flavor: TFlavor): TPoint; inline;
   private
     function GetTastyPoint: TPoint;
     function GetNastyPoint: TPoint;
   end;
 
 function TIntegerHelper.GetSomething(Flavor: TFlavor): TPoint;
 begin
   if IsConstValue(Flavor) then begin
     if Flavor = Tasty then Result:= Self.GetTastyPoint
     else Result:= Self.GetNastyPoint;
   end else begin
     Assert(1=0,'This function can only be called with constant parameters');
   end;
 end; 

procedure Test;
var
  pt: TPoint;
begin
  pt:= 100000.GetSomething(Tasty); 

该调用将被转换为GetTastyPoint,并且if / then序列将被链接器消除.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读