Delphi има този списък: Delphi Intrinsic Routines
Но този списък е непълен .
Кои са 7-те недокументирани вътрешни функции, откога и каква е тяхната цел?
Delphi има този списък: Delphi Intrinsic Routines
Но този списък е непълен .
Кои са 7-те недокументирани вътрешни функции, откога и каква е тяхната цел?
Знам за следните недокументирани вътрешни функции.
Delphi 2007: тук и Блогът на Hallvard:
По подразбиране
function Default(T: Typeidentifier): value of T;
Връща нулевото представяне на идентификатора на типа T
.
Следните вътрешни характеристики, въведени в XE7, са обяснени в блога за бета версия на XE7 и от Стефан Глиенке
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;
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);This call will get translated to GetTastyPoint and theif/then
sequence will be eliminated by the linker.