字节对齐的细节和编译器实现相关,一般而言,需要满足 3 个准则:
1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2. 结构体每个成员相对于结构地体首地址的偏移量(offset)都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节( internal adding);
3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节( trailing padding)。
示例程序
struct A {
short i;
};
struct B {
int j;
short i;
};
struct C {
short i;
int j;
};
struct D {
};
int main(){
struct A a;
struct B b;
struct C c;
struct D d;
printf("sizeof(a) is %d\n", sizeof(a));
printf("sizeof(b) is %d\n", sizeof(b));
printf("sizeof(c) is %d\n", sizeof(c));
printf("sizeof(d) is %d\n", sizeof(d));
return 0;
}
输出结果如下
sizeof(a) is 2
sizeof(b) is 8
sizeof(c) is 8
sizeof(d) is 0
主要说明第一个结构A
short 后面没有int或者double,long之类的更大宽度的,所以对于short不需要与“更宽”的成员对齐,所以是short的大小2
本文详细解析了字节对齐的三个核心准则,包括结构体成员的对齐方式、偏移量计算及总大小调整。通过具体示例,展示了不同结构体布局下编译器如何进行内部填充,确保数据高效存储。

1710

被折叠的 条评论
为什么被折叠?



