字节对齐问题

本文详细解析了字节对齐的三个核心准则,包括结构体成员的对齐方式、偏移量计算及总大小调整。通过具体示例,展示了不同结构体布局下编译器如何进行内部填充,确保数据高效存储。

字节对齐的细节和编译器实现相关,一般而言,需要满足 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值