德尔福有这个清单:Delphi Intrinsic Routines
但该清单不完整。
存在哪些无证件的内在函数,因为它们的用途何时及其目的是什么?
答案 0 :(得分:24)
我知道以下未记录的内在函数。
Delphi 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
是interface
,string
或dynamic 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
序列。