Spec-Zone.ru › GCC 10

Далее: Уборка мусора, Предыдущий: +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's, потому что объекты выделяются с использованием типовой памяти, доступной в этом сборщике. Выделение типовой памяти требует информации о расположении указателей внутри объекта.

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

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

указатели ‘^’ за которым следует тип указателя.
массивы ‘[’ за которым следует количество элементов в массиве, затем тип элементов, и затем ‘]’
структуры ‘{’ за которым следует имя структуры (или ‘?’ если структура безымянная), знак ‘=’, тип членов и ‘}’
объединения ‘(’ за которым следует имя структуры (или ‘?’ если объединение безымянное), знак ‘=’, тип членов и ‘)’
вектора ‘![’ за которым следует 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-10.5.0/gcc/Type-encoding.html

Spec-Zone.ru

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