无证的内在惯例

时间:2015-05-23 20:23:03

标签: delphi documentation intrinsics

德尔福有这个清单:Delphi Intrinsic Routines
但该清单不完整。

存在哪些无证件的内在函数,因为它们的用途何时及其目的是什么?

1 个答案:

答案 0 :(得分:24)

我知道以下未记录的内在函数。

Delphi 2007:hereHallvard's blog

默认

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

返回类型标识符T的零表示形式。

解释了XE7中引入的以下内在函数in the XE7 beta blogStefan Glienke

IsManagedType

function IsManagedType(T: TypeIdentifier): Boolean;   

如果Tinterfacestringdynamic array,或者包含此类的记录,则为真。包含托管类型的类将返回false。

在XE6及更早版本中,您必须使用System.Rtti.IsManaged(TypeInfo(T))

HasWeakRef

function HasWeakRef(T: TypeIdentifier): Boolean;    

如果T已注释为[weak],则为真。编译器保留[weak]引用的列表。您不能对这些类型使用move和其他技巧,因为这会阻止弱列表更新。

在XE6及更早版本中,您必须使用System.TypInfo.HasWeakRef(TypeInfo(T))

GetTypeKind

function GetTypeKind(T: TypeIdentifier): TTypeKind;   

PTypeInfo(System.TypeInfo(T))^.Kind;完全相同,但是因为它是编译器内在函数,所以在编译时解析函数,并且编译器将剥离计算结果为false的条件代码。

IsConstValue

function IsConstValue(const Value): Boolean;          

如果值是常量,则为真,否则为假 这有助于编译器消除死代码,因为函数是在编译时评估的 这仅适用于内联函数,它允许更短的生成代码。

TypeInfo

function TypeInfo(T: typeindentifier): PTypeInfo;

此功能不是未记录的,但 未记录的是它是XE7以来的内在功能。
这意味着如果T不是一个字节,则代码段if TypeInfo(T) = TypeInfo(byte) then ...不会生成任何代码,并且测试将在编译时解析。 但是,编译时解决方案仅适用于通用例程,并且仅在进行if (TypeInfo(T) = TypeInfo(sometype)测试时才有效 即使测试总是评估为假,测试if TypeInfo(byte) = TypeInfo(smallint) then也不会被消除 也没有使用TypeInfo(T)

返回地址

以下内容与raise exception at 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序列。