Przyjęta odpowiedź ("Nie") jest poprawna, ale chciałem wyjaśnić jedną potencjalnie wprowadzającą w błąd jej część. Dodałem komentarz, ale muszę sformatować jakiś kod; stąd nowa odpowiedź.
typedefs to tylko pseudonimy i aliasy dla określonego typu rzeczywistego, nie istnieje jako odrębny typ mieć inny wyrównanie, pakowania itp ..
ta jest błędna, przynajmniej dla GCC (kompilator OP) i GHS. Na przykład poniższe kompiluje się bezbłędnie, pokazując, że wyrównanie może być dołączone do typedef.
Perwersyjne wyrównanie (większe niż rozmiar obiektu) jest jedynie wartością szoku i rozrywki.
#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);
}
Zdecydowanie nie jest głupie pytanie. Myślę, że myAlignedStruct2 jest dopasowany w taki sam sposób jak myAlignedStruct, ale chciałby być tego pewien. Czy wypróbowałeś printf ("rozmiary:% d,% d", sizeof (myAlignedStruct), sizeof (myAlignedStruct2)); ? – Shlublu
@Shlublu: 'sizeof' sprawdza pakowanie, ale wyrównanie jest inne! Nie ma standardowego operatora, ale GCC dostarcza '__alignof __()' jak pokazano w mojej odpowiedzi. –
Ah, przepraszam, pomieszałem się! To sprawia, że Twoje pytanie jest jeszcze bardziej interesujące! – Shlublu