C语言字节对齐

本文介绍了C语言中的字节对齐概念,包括自然对齐和强制对齐。自然对齐遵循数据成员和整体对齐规则,确保结构体内存布局优化。强制对齐则允许指定n字节对齐,影响结构体大小计算。举例说明了不同对齐方式下结构体大小的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言字节对齐

C语言字节对齐方式分为自然对齐和强制对齐两种。在结构体的大小的计算中,常会用到字节对齐的知识。


自然对齐

自然对齐规则

  • 数据成员对齐规则

    在默认情况下,结构体成员变量的存放起始地址相对于结构体的起始地址的偏移量为sizeof(类型)的倍数。

  • 整体对齐规则

    结构体总体大小必须为sizeof(最大类型)的整数倍。

自然对齐例子

    struct one
    {
        char   a;
        int    b;
        long   c;
        double d;
    };

sizeof(one) = sizeof(char) + 3 + sizeof(int) + sizeof(long) + 4 + sizeof(double) = 24;24为3 * sizeof(double),满足整体对齐规则。

强制对齐

通过下面指令指定按n字节强制对齐

    #pragma pack(n) //指定以下代码为n字节对齐
    ···
    ···
    #pragma pack()  //恢复默认对齐方式

还可以通过下面的方式保存原有的对齐方式

    #pragma pack(push)  //保存现有的对齐方式
    #pragma pack(n)     //指定新的对齐方式
    ···
    ···
    #pragma pack(pop)   //恢复原来的对齐方式
    ···
    ···

强制对齐规则

  • 数据成员对齐规则

    结构体成员变量的存放起始地址相对于结构体的起始地址的偏移量为min{ sizeof(类型), n }的整数倍。

  • 整体对齐规则

    结构体总体大小必须为min{ sizeof(类型), n }的整数倍。

强制对齐例子

    #pragma pack(4)
    struct two
    {
        char   a;
        int    b;
        long   c;
        double d;
        char   e;
    };

在四字节对齐情况下struct two的大小,
sizeof(two)= sizeof(char) + 3 + sizeof(int) + sizeof(long) + sizeof(double) +sizeof(e) + x ;
sizeof(two) = 21 + x;
由于sizeof(two)必须是 min {sizeof(double),4 }的整数倍,也就是4的整数倍 ,所以x = 3,故:
sizeof(two) = 24。

    #pragma pack(2)
    struct two
    {
        char   a;
        int    b;
        long   c;
        double d;
        char   e;
    };

同样是struct two,如果是按照2字节对齐,则
sizeof(two) = sizeof(char) + 1 + sizeof(int) + sizeof(long) + sizeof(double) + sizeof(char) + x;
sizeof(two) = 19 + x;
由于sizeof(two)必须是min {sizeof(double), 2 }的整数倍,也就是2的整数倍,所以x= 1,故:
sizeof(two) = 20。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值