Выравнивание структуры в GCC (должно ли выравнивание быть указано в typedef?)
извините за глупый вопрос, но если мне нужно обеспечить выравнивание структуры / класса / объединения, я должен добавить атрибут((выровнено (выровнено))) для объявления typedef?
class myAlignedStruct{} __attribute__ ((aligned(16)));
typedef myAlignedStruct myAlignedStruct2; // Will myAlignedStruct2 be aligned by 16 bytes or not?
2 ответов
должен ли я добавить атрибут((выровненный(выровненный))) в объявление typedef?
нет... typedefs - это просто псевдонимы или псевдонимы для указанного типа, они не существуют как отдельный тип, чтобы иметь различное выравнивание, упаковку и т. д..
#include <iostream>
struct Default_Alignment
{
char c;
};
struct Align16
{
char c;
} __attribute__ ((aligned(16)));
typedef Align16 Also_Align16;
int main()
{
std::cout << __alignof__(Default_Alignment) << '\n';
std::cout << __alignof__(Align16) << '\n';
std::cout << __alignof__(Also_Align16) << '\n';
}
выход:
1
16
16
принятый ответ ("Нет") верен, но я хотел прояснить одну потенциально вводящую в заблуждение его часть. Я бы добавил комментарий, но нужно отформатировать некоторый код; следовательно, новый ответ.
typedefs - это просто псевдонимы или псевдонимы для указанного фактического типа, они не существуют как отдельный тип для другого выравнивания, упаковки и т. д..
Это неверно, по крайней мере, для GCC (компилятора OP) и GHS. Например, следующие компиляции без ошибки, показывающие, что выравнивание can быть прикрепленным к typedef.
извращенное выравнивание (больше, чем размер объекта) - это просто для шока и развлечения.
#define CASSERT( expr ) { typedef char cassert_type[(expr) ? 1 : -1]; }
typedef __attribute__((aligned(64))) uint8_t aligned_uint8_t;
typedef struct
{
aligned_uint8_t t;
} contains_aligned_char_t;
void check_aligned_char_semantics()
{
CASSERT(__alignof(aligned_uint8_t) == 64);
CASSERT(sizeof(aligned_uint8_t) == 1);
CASSERT(sizeof(contains_aligned_char_t) == 64);
}