为什么结构及其 typedef 在对齐时占用不同的大小?

Why structure and its typedef consume different size when aligned?

我原以为两个尺寸都是 8,但我得到 sizeof(myStruct) = 16, sizeof(myType) = 8。我用 MinGW 在 Windows 64 位机器上编译了这个。

#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 documentation on this 没有说明为结构指定此属性会影响其成员,但情况似乎是这样。)

typedef struct { … } s2 __attribute__((aligned));s2是普通对齐要求的结构,所以它的b成员放在4字节的倍数处,总大小为8字节,然后s2 类型应该对齐到“最大对齐”。因此,当创建s2个对象时,它们将被放置在8的倍数的位置,但其中成员的布局不会改变。

要使使用 typedef 定义的 structurestruct s1 具有相同的布局,您可以使用 typedef struct { … } __attribute__((aligned)) s2;.