Spec-Zone.ru › GCC 12

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API