8.3 Кодирование типов
Этот раздел является продвинутым. Кодирование типов широко используется компилятором и во время выполнения, но вам, как правило, не нужно знать о нём для использования Objective-C.
Компилятор Objective-C генерирует кодирование типов для всех типов. Это кодирование используется во время выполнения для получения информации о селекторах и методах, а также об объектах и классах.
Типы кодируются следующим образом:
_Bool |
B |
char |
c |
unsigned char |
C |
short |
s |
unsigned short |
S |
int |
i |
unsigned int |
I |
long |
l |
unsigned long |
L |
long long |
q |
unsigned long long |
Q |
float |
f |
double |
d |
long double |
D |
void |
v |
id |
@ |
Class |
# |
SEL |
: |
char* |
* |
enum |
Перечисление enum кодируется точно как целочисленный тип, используемый компилятором для него, что зависит от значений перечисления. Часто компилятор использует unsigned int, который затем кодируется как I. |
| неизвестный тип | ? |
| Сложные типы |
j за которым следует внутренний тип. Например, _Complex double кодируется как "jd". |
| битовые поля |
b за которым следует начальная позиция битового поля, тип битового поля и размер битового поля (кодирование битовых полей было изменено по сравнению с кодированием компилятора NeXT, см. ниже) |
Кодирование битовых полей было изменено, чтобы позволить битовым полям правильно обрабатываться функциями времени выполнения, которые вычисляют размеры и выравнивание типов, содержащих битовые поля. Предыдущее кодирование содержало только размер битового поля. Используя только эту информацию, невозможно надёжно вычислить занимаемый битовым полем размер. Это очень важно в присутствии сборщика мусора Boehm, так как объекты выделяются с использованием доступных в этом сборщике типов памяти. Выделение типизированной памяти требует информации о том, где находятся указатели внутри объекта.
Позиция в битовом поле — это позиция, считая в битах, ближайшего к началу структуры бита.
Неатомарные типы кодируются следующим образом:
| указатели | ‘^’ за которым следует тип указателя. |
| массивы | ‘[’ за которым следует количество элементов в массиве, за которым следует тип элементов и за которым следует ‘]’ |
| структуры | ‘{’ за которым следует имя структуры (или ‘?’, если структура неименованная), знак ‘=’, тип членов и ‘}’ |
| объединения | ‘(’ за которым следует имя структуры (или ‘?’, если объединение неименованное), знак ‘=’, тип членов и ‘)’ |
| вектора | ‘![’ за которым следует размер вектора (количество байт, составляющих вектор), за которым следует запятая, за которой следует выравнивание (в байтах) вектора, за которым следует тип элементов и за которым следует ‘]’ |
Вот некоторые типы и их кодирование, как они генерируются компилятором на машине i386:
| Тип Objective-C | Кодирование компилятора |
|---|---|
int a[10]; |
[10i] |
struct {
int i;
float f[3];
int a:3;
int b:2;
char c;
}
|
{?=i[3f]b128i3b131i2c} |
int a __attribute__ ((vector_size (16))); |
![16,16i] (выравнивание зависит от машины) |
Помимо типов, компилятор также кодирует спецификаторы типов. Таблица ниже описывает кодирование текущих спецификаторов типов Objective-C:
| Спецификатор | Кодирование |
|---|---|
const |
r |
in |
n |
inout |
N |
out |
o |
bycopy |
O |
byref |
R |
oneway |
V |
Спецификаторы типов кодируются непосредственно перед типом. Однако в отличие от типов, спецификаторы типов кодируются только тогда, когда они появляются в типах аргументов методов.
Обратите внимание, как const взаимодействует с указателями:
| Тип Objective-C | Кодирование компилятора |
|---|---|
const int |
ri |
const int* |
^ri |
int *const |
r^i |
const int* — это указатель на const int, и поэтому он кодируется как ^ri. int* const, наоборот, — это const указатель на int, и поэтому он кодируется как r^i.
Наконец, существует осложнение при кодировании const char * по сравнению с char * const. Так как char * кодируется как *, а не как ^c, нет способа выразить тот факт, что r относится к указателю или к адресуемому объекту.
Поэтому по соглашению считается, что r* означает const
char * (так как это чаще всего подразумевается), и нет способа закодировать char *const. char *const будет просто закодировано как *, а const потеряно.
| • Кодирование старых типов: | ||
| • @encode: | ||
| • Подписи методов: |
Следующий: Сбор мусора, Предыдущий: Выполнение кода до main, Вверх: Objective-C [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Type-encoding.html