struct数据对齐
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))
之后不会对结构体进行对齐,占用的字节数等于结构体中各字段字节大小之和。
- 原文作者:生如夏花
- 原文链接:https://blduan.top/post/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/c/struct%E6%95%B0%E6%8D%AE%E5%AF%B9%E9%BD%90/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。