Nieudokumentowane procedury wewnętrzne [zamknięte]
Delphi ma taką listę: procedury wewnętrzne Delphi
Ale ta lista jest niekompletna.
Które nieudokumentowane funkcje wewnętrzne istnieją, od kiedy i jaki jest ich cel?
1 answers
Znam następujące nieudokumentowane funkcje wewnętrzne.
Delphi 2007: tutaj i Hallvard ' s blog :
Default
function Default(T: Typeidentifier): value of T;
Zwraca zerową reprezentację identyfikatora typu T
.
IsManagedType
function IsManagedType(T: TypeIdentifier): Boolean;
True if T
is a interface
, string
lub dynamic array
, lub zapis zawierający takie Klasa zawierająca Typ zarządzany zwróci false.
W XE6 i starszych musisz użyć System.Rtti.IsManaged(TypeInfo(T))
.
HasWeakRef
function HasWeakRef(T: TypeIdentifier): Boolean;
True, Jeśli T
zostało oznaczone jako [weak]
. Kompilator przechowuje listę referencji [weak]
. Nie możesz używać move
i innych sztuczek z tymi typami, ponieważ uniemożliwi to aktualizację słabej listy.
W XE6 i starszych musisz użyć System.TypInfo.HasWeakRef(TypeInfo(T))
.
GetTypeKind
function GetTypeKind(T: TypeIdentifier): TTypeKind;
Robi to samo co PTypeInfo(System.TypeInfo(T))^.Kind;
, jednak ponieważ jest to kompilator wewnętrzny, funkcja jest rozwiązywana w compiletime, a kod warunkowy, który zostanie oceniony na false, zostanie usunięty przez kompilator.
IsConstValue
function IsConstValue(const Value): Boolean;
True jeśli wartość jest stała, false jeśli nie.
Pomaga to kompilatorowi wyeliminować martwy Kod, ponieważ funkcja jest oceniana w czasie kompilacji.
To jest przydatne tylko w funkcjach inline, gdzie pozwala na krótszy generowany kod.
TypeInfo
function TypeInfo(T: typeindentifier): PTypeInfo;
Ta funkcja nie jest nieudokumentowana jako taka, ale to, co jest nieudokumentowane, to to, że jest wewnętrzną funkcją od XE7.
Oznacza to, że urywek if TypeInfo(T) = TypeInfo(byte) then ...
Nie generuje żadnego kodu, jeśli T nie jest bajtem, a test zostanie rozwiązany w czasie kompilacji.
Jednak rozdzielczość w czasie kompilacji działa tylko wewnątrz ogólnych procedur i tylko podczas wykonywania if (TypeInfo(T) = TypeInfo(sometype)
test.
Test if TypeInfo(byte) = TypeInfo(smallint) then
nie zostaje wyeliminowany, mimo że zawsze ocenia się go na false.
Podobnie jak inne użycie TypeInfo(T)
.
ReturnAddress
Poniższe są używane z raise exception at returnaddress
konstrukcją.
function ReturnAddress(Expression): pointer; //Delphi ?
function AddressOfReturnAddress(Expression): pointer; //Delphi ?
I z tego co wiem, nie można do nich dzwonić bezpośrednio z kodu użytkownika.
Przykład 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);Wywołanie to zostanie przetłumaczone na GetTastyPoint, a Sekwencjaif/then
zostanie wyeliminowana przez linker.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 11:31:16