Выравнивание и abi
У меня есть пара вопросов, которые касаются выравнивания полей простых структур (pod) и правильной портируемой реализации интерфейсов, в которых такие структуры используются (стандартизация и стабильность abi).
Дают ли стандарты C и C++ гарантии, что разметка следующего типа везде и всегда будет одинакова?
struct Type { char a; uint32_t b; };
Каков самый правильный способ выразить портируемый и стабильный формат типа языковыми средствами? Предположим, что порядок байтов нас не интересует, а размеры полей в составном типе гарантированно известны. Многие просто используют упакованные структуры, но я бы такой вариант портируемым и безопасным не назвал.
Ответы (1 шт):
Нет, стандарт разрешает любые дополнительные оступы в структуре (но не перед первым элементом). Но на практике ничего такого быть не должно. Также стандарт не требует выравнивания uint32_t по 4 байтам.
Упакованные структуры. Даже у GCC и MSVC синтакис для них почти одинаковый, так что довольно портируемо на мой вкус.
Если не нравится, то можно вместо этого можно для спокойствия заполнить весь padding в структуре неиспользуемыми переменными (или безымянными битовыми полями).