Я ожидал, что оба размера будут 8, но я получил sizeof(myStruct) = 16, sizeof(myType) = 8. Я скомпилировал это на 64-битной машине Windows с MinGW.
#include <stdio.h>
#include <stdint.h>
struct s1{
int8_t a;
int32_t b;
} __attribute__((aligned));
typedef struct{
int8_t a;
int32_t b;
}s2 __attribute__((aligned));
struct s1 myStruct;
s2 myType;
int main(int argc, char **argv)
{
printf("sizeof(myStruct) = %zu, sizeof(myType) = %zu\n", sizeof(myStruct), sizeof(myType));
return 0;
}





struct s1 { … } __attribute__((aligned)); говорит, что члены struct s1 должны быть выровнены по «максимальному выравниванию» для цели, что, по-видимому, составляет 8 байтов. Таким образом, размер каждого члена кратен 8 байтам, что делает всю структуру 16-байтовой. (В GCC документация по этому не указано, что указание этого атрибута для структуры влияет на ее элементы, но, похоже, это так.)
typedef struct { … } s2 __attribute__((aligned)); говорит, что s2 является структурой с обычными требованиями к выравниванию, поэтому ее элемент b помещается в кратное 4 байтам, а общий размер равен 8 байтам, а затем тип s2 должен быть выровнен по «максимальному выравниванию». Таким образом, при создании объектов s2 они будут размещаться в местах, кратных 8, но расположение членов внутри них не изменится.
Чтобы structure, определенный с помощью typedef, имел тот же макет, что и struct s1, вы можете использовать typedef struct { … } __attribute__((aligned)) s2;.
Вы поставили
__attribute__((aligned))послеs2, а не перед ним.