Linux x86-64环境下C语言结构体为何无需填充仍被编译器填充?
Linux x86-64下C语言结构体填充的问题解析
先明确x86-64 Linux环境下的基本规则:
int占4字节,对齐要求4字节char占1字节,对齐要求1字节- 指针(如
char*)占8字节,对齐要求8字节 - 结构体的整体对齐要求等于其最大成员的对齐值,且总大小必须是该对齐值的整数倍
struct a的内存布局分析
struct a { int ak; // 4字节,地址范围0-3 char ac; // 1字节,地址4 // 填充3字节(地址5-7):因为后续指针需要8字节对齐,必须从8的倍数地址开始 char* aptr;// 8字节,地址8-15 };
总大小:4+1+3+8=16,刚好是8的倍数,满足结构体对齐要求。
struct b的内存布局分析
struct b { char* bptr;// 8字节,地址范围0-7 int bk; // 4字节,地址8-11 char bc; // 1字节,地址12 // 填充3字节(地址13-15):结构体整体要满足8字节对齐,当前成员总字节数13不是8的倍数,必须补到16 };
成员排列确实没有跨字块,但结构体末尾的填充是为了保证结构体数组的对齐正确性:如果struct b大小是13,数组中第二个元素的起始地址就是13,而指针成员需要8字节对齐,13不是8的倍数,会导致对齐错误。
内容的提问来源于stack exchange,提问作者Mehdi Charife
相关产品推荐
相关产品推荐

