未记录的内部程序例程

20

Delphi有这个列表: Delphi 内在例程
但是该列表不完整。

有哪7个未记录的内在函数,自何时起以及其目的是什么?


这并不算太宽泛,只有7个未记录的内置函数。 - Johan
既然你已经回答了那个问题...我会跳过并留给更懂Delphi的人来决定。 - Martin Zeitler
1个回答

34
我知道以下未记录的内置函数。
Delphi 2007: 这里Hallvard's博客默认
function Default(T: Typeidentifier): value of T;     

返回类型标识符 T 的零表示。
XE7 中引入了以下内在函数,在 XE7 beta 博客中有解释,以及由 Stefan Glienke 解释。 IsManagedType
function IsManagedType(T: TypeIdentifier): Boolean;   

如果T是一个接口字符串动态数组,或者包含这些类型的记录,则为真。包含受管理类型的类将返回false。

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

HasWeakRef

function HasWeakRef(T: TypeIdentifier): Boolean;    

如果T被注释为[weak],则返回True。编译器会保留[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;          

如果Value是常量,则为True,否则为False。

这有助于编译器消除死代码,因为函数在编译时被评估。

这仅在内联函数中有用,因为它允许生成更短的代码。

TypeInfo

function TypeInfo(T: typeindentifier): PTypeInfo;

这个函数本身并没有未记录的问题,但是从XE7开始它就是一个内置函数。也就是说,如果T不是byte,那么代码片段if TypeInfo(T) = TypeInfo(byte) then ...不会生成任何代码,并且测试将在编译时解析。然而,编译时解析仅在泛型例程内部工作,并且仅在执行if (TypeInfo(T) = TypeInfo(sometype)测试时才有效。测试if TypeInfo(byte) = TypeInfo(smallint) then即使始终计算为false也不会被消除。其他使用TypeInfo(T)也一样。

ReturnAddress

以下内容与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, '此函数只能使用常量参数调用');
   end;
 end; 

procedure Test;
var
  pt: TPoint;
begin
  pt:= 100000.GetSomething(Tasty); 
此调用将被转换为GetTastyPoint,并且链接器将消除if/then序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接