Delphi имеет этот список: Внутренние процедуры Delphi
Но этот список неполный.
Какие недокументированные внутренние функции существуют, поскольку, когда и какова их цель?
Delphi имеет этот список: Внутренние процедуры Delphi
Но этот список неполный.
Какие недокументированные внутренние функции существуют, поскольку, когда и какова их цель?
Я знаю следующие недокументированные внутренние функции.
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;
, однако, поскольку он является встроенным компилятором, функция разрешается в compiletime, а условный код, который оценивает значение false, будет лишен компилятором.
IsConstValue
function IsConstValue(const Value): Boolean;
Истинно, если значение является константой, false, если нет.
Это помогает компилятору устранить мертвый код, потому что функция оценивается во время компиляции.
Это полезно только в встроенных функциях, где это позволяет использовать более короткий сгенерированный код.
ТипInfo
function TypeInfo(T: typeindentifier): PTypeInfo;
Эта функция не является недокументированной как таковая, но то, что недокументировано, заключается в том, что она является неотъемлемой функцией с XE7.
Это означает, что фрагмент if TypeInfo(T) = TypeInfo(byte) then ...
не генерирует никакого кода, если T не является байтом, и тест будет разрешен в compiletime.
Однако разрешение времени компиляции работает только в общих подпрограммах и только при выполнении теста 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, 'This function can only be called with constant parameters'); end; end; procedure Test; var pt: TPoint; begin pt:= 100000.GetSomething(Tasty);Этот вызов будет переведен в GetTastyPoint, а последовательностьif/then
будет устранена компоновщиком.