В какой степени Itanium ABI действительно указывает дополнение и выравнивание?

Мне сказали:

[ABI] гарантируют точное расположение структуры, смещение байтов каждого члена, какие биты используются для полей бит, где и сколько отступов есть и т.д.

Но я всегда считал, что отступы и выравнивание были неуказанными и ненадежными.

Использует ли Itanium ABI (который использует GCC) на самом деле определяет эти вещи (насколько я могу судить, it не отображается до без указания диапазонов)?

И если это так, как в него вписываются такие параметры, как __attribute__ ((packed))? Неужели они в конечном счете нарушают ABI, изменяя выравнивание вещей?

Или, как следует из цитаты, упаковка просто неопределена между инструментальными целями, но на самом деле надежна и предсказуема при использовании определенного ABI? И снова, как что-то вроде __attribute__ ((packed)) вписывается в это?

Ответ 1

заполнение и выравнивание не уточняются по стандарту ISO С++ и, следовательно, ненадежны.

Использование слова "точное" в цитате является преувеличением. Itanium ABI (который использует GCC) может определять эти вещи (как в пределах заданных диапазонов) по мере необходимости, а не всегда, и точный ly.

Упаковка на самом деле надежна и предсказуема при использовании инструментальных цепей, предполагающих предопределенную целевую архитектуру и окружающую среду. ABI. Когда все целевые конкретные данные, применимые к цепочке инструментов, предопределены __attribute__ ((packed)), как и любая другая конструкция, будет генерировать вывод, предсказуемый для правильной работы цепочки инструментов.

Ответ 2

Вам необходимо следовать документации по стандартам, включенным в качестве ссылок.

Размер и выравнивание большинства типов указаны в спецификациях Intel System V ABI; например, размер и выравнивание long long и long double типов документируются в двоичном интерфейсе приложения Unix System V Application, приложение процессора Itanium (№ 245370-001), таблица 3-1 Дополнительные основные типы данных.

Немного сложно найти авторитетные копии стандартов, тем более, что не существует реального процесса разработки стандартов. Хорошая ссылка, которая включает размеры и выравнивания всех типов в LP64 ABI, http://www.x86-64.org/documentation/abi.pdf, хотя она не распространяется на ILP32 ABI.

__attribute__((packed)), конечно, gcc-специфический, как и #pragma pack для MSVC. Возможно, вы сможете использовать функции совместимости компилятора, чтобы получить согласованный макет структур для компиляторов, но при условии, что поведение одинаково только потому, что реализована функция совместимости, это не очень хорошая идея; вы должны проверить, что размеры и смещения клавиш одинаковы.