为何C语言程序中struct var1大小为11而非12字节?
问题解答:struct var1大小为何是11字节而非12字节
先看你的结构体定义:
struct var1 { char data1; char arr1[10]; };
结构体的内存大小计算核心是内存对齐规则,对齐的目的是让CPU更高效地访问内存,避免跨总线周期读取数据。
步骤1:计算成员总大小
char data1占1字节char arr1[10]占10字节
成员总大小是1 + 10 = 11字节。
步骤2:确定结构体的整体对齐要求
结构体的整体对齐值,等于其内部最大基本数据类型成员的对齐要求。这里结构体里的成员都是char类型,char的对齐要求是1字节(即只要地址是1的倍数即可,不需要额外填充)。
因为整体对齐要求是1字节,结构体总大小11已经是1的整数倍,所以不需要在末尾补填充字节,最终大小就是11字节。
补充:为什么你可能误以为是12字节?
你可能混淆了包含更大类型的结构体情况。比如如果结构体里有int(对齐要求4字节),即使成员总大小是11,也会填充到12字节以满足4字节的对齐要求。但你的结构体里全是char,不存在这个问题。
顺带解释union var2的大小是8字节
你的union定义:
union var2 { int data2; char arr2[5]; };
union的大小取其内部最大成员的大小,再向上对齐到自身的最大对齐要求:
int data2占4字节,对齐要求4字节char arr2[5]占5字节,对齐要求1字节
最大成员大小是5字节,而union的对齐要求由最大的基本类型成员(int)决定为4字节,5需要向上取最近的4的倍数,也就是8,所以union var2的大小是8字节。
内容的提问来源于stack exchange,提问作者mrigendra
相关产品推荐
相关产品推荐

