64位处理器下结构体内存对齐问题:sizeof结果不符预期
结构体大小计算误区解析
你的代码如下:
struct abc { int x; int y; char a; char b; }; int main() { struct abc test; printf("%d", sizeof(test)); }
你预期输出是16,但实际得到12,核心原因是误解了C语言的结构体内存对齐规则:
- 你的环境参数:64位系统,
int占4字节,char占1字节。 - 结构体对齐的核心规则:结构体整体大小必须是其内部最大基本数据类型大小的整数倍,同时每个成员的起始地址需满足自身类型的对齐要求(这里成员中最大的类型是
int,对齐单位为4字节)。
具体内存布局拆解:
int x:占4字节,地址范围0-3(符合int的4字节对齐要求)int y:占4字节,地址范围4-7(起始地址4是4的倍数,满足对齐)char a:占1字节,地址8(char对齐要求为1字节,任意地址都符合)char b:占1字节,地址9
此时已使用的总字节数是4+4+1+1=10字节,但结构体整体大小需要是4字节的整数倍,10向上取最近的4的倍数为12,因此编译器会在b后补充2字节填充,最终结构体大小为12字节。
你之前误以为要按64位处理器的8字节读取粒度补6字节,但处理器读取粒度和C语言结构体对齐规则是两回事:处理器能一次读取8字节不代表所有类型都要按8字节对齐,int类型仅需4字节对齐就能保证高效读取,只有当结构体中存在8字节类型(如long long、指针)时,对齐单位才会变为8字节,结构体大小才可能是16字节。
内容的提问来源于stack exchange,提问作者user21214872
相关产品推荐
相关产品推荐

