Ответ 1
Числа использовались в дни m68K для обозначения компоновки стека. То есть, вы могли бы буквально декодировать подпись метода и, почти для всех типов, точно знать, какие байты в каком смещении в кадре стека вы могли бы использовать для получения/установки аргументов.
Это сработало, потому что m68K ABI был полностью [IIRC - был длинный длинный] стековый аргумент/возврат. В регистры через границы вызовов ничего не было.
Однако, поскольку Objective-C был перенесен на другие платформы, всегда в стеке уже не было соглашение о вызове. Аргументы и возвращаемые значения часто передаются в регистры.
Таким образом, эти смещения теперь бесполезны. Кроме того, кодировка типа, используемая компилятором, больше не завершена (потому что она никогда не была очень полезной), и будут типы, которые не будут закодированы. Не говоря уже о том, что кодирование некоторых шаблонных типов С++ приводит к строкам кодирования типа метода, которые могут быть многочисленными размерами Kilobytes (я думаю, что запись, на которую я столкнулся, составляла около 30 тысяч информации о типе).
Итак, нет, неправильно использовать sizeof()
для генерации чисел, потому что они фактически бессмысленны для всего. Единственная причина, по которой они все еще существуют, - это бинарная совместимость; есть фрагменты эзотерического кода здесь и там, которые все еще анализируют строку кодировки типа с ожиданием того, что здесь и там будут разбросаны случайные числа.
Обратите внимание, что в среде выполнения ObjC есть остатки API, которые все еще заставляют думать, что можно будет кодировать/декодировать кадры стека на лету. Это действительно не так, поскольку C ABI не гарантирует, что регистры аргументов будут сохранены в границах вызовов перед оптимизацией. Вам придется отказаться от сборки, и все становится ужасно действительно очень быстро ( > содрогаться <).