На практике в любой системе, где существуют типы uintXX_t
, вы получите желаемое выравнивание без заполнения. Не добавляйте уродливые gcc-измы, чтобы попытаться это гарантировать.
Редактировать: Чтобы понять, почему может быть вредно использовать attribute packed
или aligned
, это может привести к смещению всей структуры при использовании в качестве члена большая структура или в стеке. Это определенно снизит производительность и на машинах, отличных от x86, будет генерировать гораздо больший код. Это также означает, что недопустимо принимать указатель на любой член структуры, поскольку код, который обращается к значению через указатель, не будет знать, что оно может быть выровнено и, следовательно, может привести к ошибке.
Что касается необходимости, помните, что attribute
относится только к компиляторам gcc и gcc. Стандарт C не оставляет выравнивание неопределенным или неуказанным. Это определяемый реализацией , что означает, что реализация требуется для дальнейшего указания и документирования , как она ведет себя. Поведение gcc заключается в том, чтобы всегда выравнивать каждый член структуры по следующей границе его естественного выравнивания (то же самое выравнивание, которое было бы при использовании вне структуры, которое обязательно является числом, которое равномерно делит размер типа) , Поскольку attribute
является функцией gcc, если вы используете ее, вы уже используете компилятор, подобный gcc, но тогда, по предположению, у вас уже есть желаемое выравнивание.