Каковы точные правила для выравнивания структуры на iPhone OS? - PullRequest
4 голосов
/ 22 октября 2008

Я использую средства Objective-C NSMethodSignature / @encode для выполнения некоторых межъязыковых преобразований типов данных, что означает, что мне нужно иметь возможность программно копировать значения в структуру, описанную в формате @encode (). например, у меня может быть 4 числа с плавающей запятой, и мне нужно вставить их в CGRect, который представляет собой структуру, содержащую 2 структуры, каждая из которых содержит 2 числа с плавающей точкой. В терминологии @encode тип таков:

{CGRect={CGPoint=ff}{CGSize=ff}}

Для этого мне нужно уметь угадывать структуру структуры, зная только типы данных примитивных членов структуры - в этом случае 4 с плавающей запятой.

Похоже, что исторически существовали два разных соглашения для выравнивания структуры ARM. Один из них заключался в выравнивании всех членов структуры по размеру границы, который удовлетворял бы наибольшему члену. Другим было выравнивание всех элементов по размеру границы, соответствующему типу данных каждого элемента.

Что используется в OS X / iPhone OS, как на ARM, так и на x86 / x86_64?

1 Ответ

1 голос
/ 22 октября 2008

Если вы просто хотите закодировать CGRect, вам, вероятно, следует использовать добавление категории UIGeometryKeyedCoding для NSCoder -encodeCGRect: forKey:.

Если вы хотите переключаться между системами, вы можете рассмотреть возможность преобразования CGRect в NSRect с помощью NSRectFromCGRect () и затем кодирования NSRect с помощью -encodeValueOfObjCType: at:.

Если вы хотите кодировать другие структуры C, Apple придерживается очень четкой политики, изложенной в документации, озаглавленной «Кодирование и декодирование типов данных C». Как указано в разделе «Структуры и битовые поля»: «Лучший способ архивации структуры или набора битовых полей - это независимое архивирование полей и выбор подходящего типа метода кодирования / декодирования для каждого».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...