В следующей таблице приведены сведения о передаче параметров по значению (включая, директиву const) в процедуры и функции Дельфи. При передаче по ссылке (директива var), все параметры передаются как 32-битные указатели.
Тип |
Размер |
Регистр (1) |
ShortInt |
1 байт (2) |
Да |
SmallInt |
1 слово (2) |
Да |
LongInt |
1 двойное слово |
Да |
Byte |
1 байт (2) |
Да |
Word |
1 слово (2) |
Да |
Dword |
1 двойное слово |
Да |
Int64 |
8 байт |
Нет |
Boolean |
1 байт (2) |
Да |
ByteBool |
1 байт (2) |
Да |
WordBool |
1 слово (2) |
Да |
LongBool |
1 двойное слово |
Да |
Char |
1 байт (2) |
Да |
AnsiChar |
1 байт (2) |
Да |
WideChar |
1 слово (2) |
Да |
ShortString |
32-битный указатель |
Да |
AnsiString |
32-битный указатель |
Да |
WideString |
32-битный указатель |
Да |
Variant |
32-битный указатель |
Да |
Pointers |
1 двойное слово |
Да |
Objects |
32-битный указатель |
Да |
Class and Class reference |
32-битный указатель |
Да |
Procedure pointer |
1 двойное слово |
Да |
Method pointers |
Два 32-битных указателя (3) |
Нет |
Sets |
Значение типа байт/слово/двойное слово или 32-битный указатель (4) |
Да (4) |
Records |
Значение типа байт/слово/двойное слово или 32-битный указатель (4) (5) |
Да (4) |
Static Arrays |
Значение типа байт/слово/двойное слово или 32-битный указатель (4) |
Да (4) |
Dynamic arrays |
32-битный указатель |
Да |
Open array |
Два 32-битных значения (6) |
Нет |
Single |
4 байта |
Нет |
Double |
8 байт |
Нет |
Extended |
12 байт (7) |
Нет |
Real48 |
8 байт (8) |
Нет |
Currency |
8 байт |
Нет |
(1) Если указано, то тип передается через регистр. Типы, которые не указаны, всегда передаются через стек.
(2) Когда эти типы занимают менее 32 бит, тогда при передаче на стек они всегда занимают 32 бита, и значение находится в младшей части, содержимое оставшей части неопределено.
3) Указатели на метод передаются через стек, как два 32-битных указателя, указатель на экземпляр помещается перед указателем на метод, так что позже это становится младшим адресом.
(4) Если тип помещается в байт/слово/двойное слово, то он передается непосредственно. Иначе, передается 32-битный указатель на память, где хранится этот тип.
(5) При использовании соглашения по вызову типа cdecl, stdcall или safecall, записи всегда передаются через стек и их размер округляется в сторону большего двойного слова.
(6) Первое значение это 32-битный указатель на массив, а второе значение содержит количество элементов в массиве.
(7) Используются только младшие 10 байт.
(8) Используется только младшие 6 байт.