仅包含char类型成员的struct结构体是否会存在内存填充padding?
关于全unsigned char类型结构体的内存填充问题
给出的结构体定义如下:
struct dummy { unsigned char a; unsigned char b; unsigned char c; };
结论
该结构体并非在所有使用场景下都不会被编译器添加内存填充。
- 常规默认场景下:
unsigned char类型的对齐要求为1字节,三个成员在内存中连续排布,成员之间不存在填充,绝大多数桌面、移动端平台的默认编译配置下,该结构体总大小为3字节,无填充。 - 存在填充的特殊场景:
- 手动指定结构体对齐规则时:比如使用GCC/Clang的
__attribute__((aligned(4)))修饰结构体、或者开启-fpack-struct=N类编译选项强制结构体对齐粒度为N(N>1)时,编译器会在结构体末尾添加填充,让整个结构体的总大小满足对齐要求,比如强制4字节对齐时,该结构体总大小会变成4字节,最后1字节为填充内容。 - 特殊平台ABI要求:部分嵌入式平台、老旧硬件的ABI规则要求所有结构体的总大小必须为2/4等整数倍,这种情况下即使没有手动指定对齐选项,编译器也会自动在结构体末尾添加填充。
- 手动指定结构体对齐规则时:比如使用GCC/Clang的
C语言标准仅要求结构体成员的地址满足对应类型的对齐要求、且成员相对顺序和定义顺序一致,并未禁止编译器在结构体成员之间或末尾添加填充。对于该全
unsigned char类型的结构体,成员之间确实不可能出现填充,但末尾填充是标准允许的行为,并非所有场景下都不存在。
内容的提问来源于stack exchange,提问作者jestro
相关产品推荐
相关产品推荐

