Выравнивание структуры в GCC (выравнивание должно быть указано в typedef?) - PullRequest
8 голосов
/ 22 июля 2011

Извините за глупый вопрос, но если мне нужно обеспечить выравнивание структуры / класса / объединения, я должен добавить атрибут ((выровненный (выровнять))) к объявлению typedef?

class myAlignedStruct{} __attribute__ ((aligned(16)));
typedef myAlignedStruct myAlignedStruct2; // Will myAlignedStruct2 be aligned by 16 bytes or not?

Ответы [ 2 ]

10 голосов
/ 22 июля 2011

я должен добавить атрибут ((выровненный (выровнять))) к объявлению typedef?

Нет ... typedefs - просто псевдонимы или псевдонимы для фактического указанного типа, они неt существует как отдельный тип для различного выравнивания, упаковки и т. д.

#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
6 голосов
/ 18 августа 2012

Принятый ответ («Нет») правильный, но я хотел уточнить одну потенциально вводящую в заблуждение часть.Я бы добавил комментарий, но мне нужно отформатировать код;следовательно, новый ответ.

typedefs - это просто псевдонимы или псевдонимы для заданного фактического типа, они не существуют как отдельный тип, чтобы иметь различное выравнивание, упаковку и т. д.

Это неверно, по крайней мере для GCC (компилятор OP) и GHS.Например, следующие компиляции без ошибок показывают, что выравнивание может быть прикреплено к 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);
}
...