Delphi ha questo elenco: Delphi Intrinsic Routines
Ma questa lista è incompleta.Routine intrinseche non documentate
Quali funzioni intrinseche non documentate esistono, da quando e qual è il loro scopo?
Delphi ha questo elenco: Delphi Intrinsic Routines
Ma questa lista è incompleta.Routine intrinseche non documentate
Quali funzioni intrinseche non documentate esistono, da quando e qual è il loro scopo?
Conosco le seguenti funzioni intrinseche non documentate.
Delphi 2007: here e Hallvard's blog:
predefinito
function Default(T: Typeidentifier): value of T;
Restituisce la rappresentazione di zero di tipo identificativo T
.
I seguenti intrinseci introdotte in XE7 sono spiegate in the XE7 beta blog e Stefan Glienke
IsManagedType
function IsManagedType(T: TypeIdentifier): Boolean;
Vero se T
è un interface
, string
o dynamic array
, o un record contenente tale. Una classe contenente un tipo gestito restituirà false.
In XE6 e versioni precedenti è necessario utilizzare System.Rtti.IsManaged(TypeInfo(T))
.
HasWeakRef
function HasWeakRef(T: TypeIdentifier): Boolean;
True se T
è stata annotata come [weak]
. Il compilatore mantiene un elenco di riferimenti [weak]
. Non è possibile utilizzare move
e altri trucchi con questi tipi, poiché ciò impedirà l'aggiornamento dell'elenco debole.
In XE6 e versioni precedenti è necessario utilizzare System.TypInfo.HasWeakRef(TypeInfo(T))
.
GetTypeKind
function GetTypeKind(T: TypeIdentifier): TTypeKind;
fa la stessa cosa come PTypeInfo(System.TypeInfo(T))^.Kind;
, ma perché è un compilatore intrinseco della funzione viene risolto a compiletime e il codice condizionale che restituisce false sarà spogliato dal compilatore.
IsConstValue
function IsConstValue(const Value): Boolean;
vero se il valore è una costante, false in caso contrario.
Questo aiuta il compilatore ad eliminare il codice morto perché la funzione viene valutata in fase di compilazione.
Questo è utile solo nelle funzioni inline, dove consente di codice generato più breve.
TypeInfo
function TypeInfo(T: typeindentifier): PTypeInfo;
Questa funzione non è documentato in quanto tale, ma ciò è irregolare è che si tratta di una funzione intrinseca dal XE7.
Ciò significa che lo snippet if TypeInfo(T) = TypeInfo(byte) then ...
non genera alcun codice se T non è un byte e il test verrà risolto in compiletime.
Tuttavia la risoluzione in fase di compilazione funziona solo all'interno di routine generiche e solo quando si esegue un test if (TypeInfo(T) = TypeInfo(sometype)
.
Il test if TypeInfo(byte) = TypeInfo(smallint) then
non viene eliminato anche se viene sempre valutato come falso.
Né fa altro uso di TypeInfo(T)
.
ReturnAddress
I seguenti sono usati con il costrutto raise exception at returnaddress
.
function ReturnAddress(Expression): pointer; //Delphi ?
function AddressOfReturnAddress(Expression): pointer; //Delphi ?
E per quanto ne so non è possibile chiamarli direttamente dal codice utente.
Esempio di 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);Questa chiamata sarà ottenere tradotto in GetTastyPoint e la sequenzaif/then
sarà eliminato dal linker.