C语言结构体不同字段之间按照系统位数进行数据对齐,32位系统4字节对齐,64位系统8字节对齐。

GCC编译器默认会进行数据对齐,但也提供了专用属性__attribute__((packed))使结构体采用紧凑模式,不对数据进行对齐,此时sizeof获得的大小为结构体各字段的大小。

GCC之__attribute__((packed))紧凑模式

默认情况下,GCC采用非紧凑模式,结构体中的字段会议系统字长(64位系统为8字节)为单位进行对齐,可使用GCC的编译属性__attribute__((packed))启用紧凑模式,不再对齐。

下面的示例展示了采用__attribute__((packed))前后结构的字节占用情况:

#include <stdio.h>
typedef struct
{
    char a;
    int b;
} st1;
typedef struct
{
    char a;
    int b;
} __attribute__((packed)) st2;

int main()
{
    printf("st1 size=%lu, st2 size=%lu\n", sizeof(st1), sizeof(st2));
}
// st1 size=8, st2 size=5

从示例输出数据中明显可以看到,使用了__attribute__((packed))之后不会对结构体进行对齐,占用的字节数等于结构体中各字段字节大小之和。