Spec-Zone.ru › GCC 6

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

Далее: Сбор мусора, Предыдущий: Выполнение кода перед main, Вверх: Objective-C [Оглавление][Индекс]

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

Spec-Zone.ru

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