Мне сказали:
[ABI] гарантирует точную компоновку структуры, смещение байтов каждого члена, какие биты используются для битовых полей, где и сколько там заполнения и т. Д.
Но я всегда считал, что отступы и выравнивание не были определены и ненадежны.
Есть ли Itanium ABI (который использует GCC) на самом деле указать эти вещи (насколько я могу сказать, это не похоже на за пределами указанных диапазонов)?
И если это так, как варианты, как __attribute__ ((packed))
вписаться в это? В конечном счете они нарушают ABI, изменяя выравнивание вещей?
Или, как следует из цитаты, упаковка просто не определена между цепочками инструментов, но на самом деле надежна и предсказуемый в рамках использования определенного ABI? А потом опять как то как то __attribute__ ((packed))
вписаться в это?
отступы и выравнивание не определены в спецификации C ++ стандарта ISO и, следовательно, ненадежны.
Использование слова «точный» в цитате является преувеличением. Itanium ABI (который использует GCC) может указывать эти вещи (как в пределах указанных диапазонов) по мере необходимости, а не всегда и точный LY.
Упаковка на самом деле надежна и предсказуема при использовании цепочек инструментов, предполагающих заранее заданную целевую архитектуру & окружающая среда — ABI. Когда все конкретные целевые детали, применимые к цепочке инструментов, предопределены __attribute__ ((packed))
Как и любая другая конструкция, она будет генерировать выходные данные предсказуемо для правильной работы цепочки инструментов.
Вы должны следовать документации к стандартам, включенным в качестве ссылки.
Размер большинства типов и выравнивание указано в Intel Система V ABI технические характеристики; например, long long
а также long double
Размер и выравнивание типов задокументированы в Двоичный интерфейс приложения Unix System V, дополнение к процессору Itanium (№ 245370-001), таблица 3-1 Дополнительные основные типы данных.
Достаточно сложно найти авторитетные копии стандартов, тем более что нет реального процесса разработки стандартов. Хорошая ссылка, которая включает в себя размеры и выравнивания всех типов в LP64 ABI: http://www.x86-64.org/documentation/abi.pdf хотя это не покрывает ILP32 ABI.
__attribute__((packed))
конечно gcc-специфичный, как это #pragma pack
для MSVC. Возможно, вы сможете использовать функции совместимости компилятора, чтобы получить согласованное расположение структур между компиляторами, но предполагать, что поведение одинаково только потому, что реализована функция совместимости, не очень хорошая идея; Вы должны проверить, что размеры и смещения клавиш одинаковы.