C语言中成员数量相同的两个结构体sizeof结果不同的原因是什么?
为什么两个结构体大小不同?
嗨,这个问题其实是C语言里很常见的内存对齐搞的鬼!咱们来一步步拆解为什么两个结构体的sizeof结果不一样。先把你的代码整理得更清晰些:
typedef struct a { int x; char a; int y; char b; int z; char c; } s1; typedef struct b { int x; int y; int z; char a; char b; char c; } s2; int main() { printf("%d %d\r\n", sizeof(s1), sizeof(s2)); return 0; }
接下来咱们分析内存布局——这里假设你的编译器默认按4字节对齐(这是32/64位系统中int类型的常见对齐规则):
结构体s1的内存占用
s1的成员是int → char → int → char → int → char的交替排列,每个int占4字节,char占1字节,但对齐规则要求每个成员的起始地址必须是自身大小的整数倍:
int x:占用0-3字节(共4字节)char a:占用4字节,但下一个成员是int,必须从8字节开始(4的倍数),所以在4-7字节间填充3个空字节int y:占用8-11字节(共4字节)char b:占用12字节,同样需要填充3个空字节到15字节,才能让下一个int z从16字节开始int z:占用16-19字节(共4字节)char c:占用20字节,最后结构体整体大小必须是最大成员大小(4字节)的整数倍,所以再填充3个空字节到23字节
最终s1的总大小是24字节。
结构体s2的内存占用
s2把所有int成员放在一起,再集中放char成员,布局紧凑很多:
int x:0-3字节,int y:4-7字节,int z:8-11字节(三个int总共12字节)char a:12字节,char b:13字节,char c:14字节(三个char共3字节)- 最后结构体整体需要对齐到4字节的倍数,所以填充1个空字节到15字节
最终s2的总大小是16字节。
额外补充
内存对齐是编译器的默认优化,目的是让CPU更高效地读取内存(CPU通常按固定大小的块读取内存,不对齐的话需要两次读取拼接,会拖慢速度)。如果确实需要让两个结构体大小一致(比如序列化数据的场景),可以用编译器指令修改对齐规则:
#pragma pack(1) // 强制按1字节对齐,关闭自动填充 typedef struct a { ... } s1; typedef struct b { ... } s2; #pragma pack() // 恢复默认对齐规则
但这种做法会牺牲CPU的访问性能,除非有特殊需求,否则不建议这么做。
内容的提问来源于stack exchange,提问作者Yousif Dafalla
相关产品推荐
相关产品推荐

