Spec-Zone.ru › GCC 11

Следующая: Уборка мусора, Предыдущая: +load: Выполнение кода перед main, Наверх: Особенности GNU Objective-C [Содержание][Индекс]

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, потому что объекты выделяются с помощью механизма типизированной памяти, доступного в этом сборщике. Выделение типизированной памяти требует информации о том, где находятся указатели внутри объекта.

Позиция в битовом поле — это позиция, считая в битах, самого близкого к началу структуры бита.

Неатомные типы кодируются следующим образом:

указатели ‘^’ за которым следует тип, на который указывает указатель.
массивы ‘[’ за которым следует число элементов в массиве, за которым следует тип элементов, за которым следует ‘]’
структуры ‘{’ за которым следует имя структуры (или ‘?’ если структура без имени), знак ‘=’, тип членов и ‘}’
объединения ‘(’ за которым следует имя структуры (или ‘?’ если объединение без имени), знак ‘=’, тип членов и ‘)’
векторы ‘![’ за которым следует vector_size (число байт, составляющих вектор), за которым следует запятая, за которой следует выравнивание (в байтах) вектора, за которым следует тип элементов и ‘]’

Вот некоторые типы и их кодирования, сгенерированные компилятором на машине 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
  • Подписи методов

Следующая: Уборка мусора, Предыдущая: +load: Выполнение кода перед main, Наверх: Особенности GNU Objective-C [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Type-encoding.html

Spec-Zone.ru

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