Выравнивание структуры в 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);
}