gpt4 book ai didi

delphi - 未记录的内在例程

转载 作者:行者123 更新时间:2023-12-03 14:35:09 24 4
gpt4 key购买 nike

Delphi 有这个列表:Delphi Intrinsic Routines
但该 list 并不完整。

7 个未记录的内在函数是什么,从什么时候开始的,它们的目的是什么?

最佳答案

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

德尔福 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;   

如果 T 则为真是 interface , stringdynamic array ,或包含此类的记录。包含托管类型的类将返回 false。

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

HasWeakRef

function HasWeakRef(T: TypeIdentifier): Boolean;    

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

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

获取类型种类

function GetTypeKind(T: TypeIdentifier): TTypeKind;   

PTypeInfo(System.TypeInfo(T))^.Kind;做同样的事情,但是因为它是编译器内在函数,所以该函数在编译时解析,并且计算结果为 false 的条件代码将被编译器删除。

IsConstValue

function IsConstValue(const Value): Boolean;          

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

类型信息

function TypeInfo(T: typeindentifier): PTypeInfo;

这个函数本身并不是没有文档记录的,但是没有文档记录的是它是自 XE7 以来的一个内部函数。
这意味着片段 if TypeInfo(T) = TypeInfo(byte) then ...如果 T 不是字节,则不会生成任何代码,并且测试将在编译时解决。
然而,编译时解析仅在通用例程内有效,并且仅在执行 if (TypeInfo(T) = TypeInfo(sometype) 时有效。测试。
测试if TypeInfo(byte) = TypeInfo(smallint) then即使它总是评估为 false,也不会被消除。
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序列将被连接子消除。

关于delphi - 未记录的内在例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com