Spec-Zone.ru › GCC 14

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
  • Подписи методов

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

Spec-Zone.ru

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