c语言 结构体对齐问题

1 问题

 2 代码模拟运行

使用#pragma pack(4)  模拟 32位系统中 对齐字节为4的情况。

#include <stdio.h>

#pragma pack(4)
struct A
{
    int a;
    short b;
    int c;
    char d;
};
struct B
{
    double a;
    short b;
    int c;
    char d;
};

int main(int argc, char const *argv[])
{
    printf("sizeof(A)=%lu\n",sizeof(struct A));   // 16
    printf("sizeof(B)=%lu\n",sizeof(struct B));    //4+4+(2)+4+(1) --》20

    return 0;
}

 将 #pragma pack(4) 注释掉,在ubuntu 64 gcc的环境下 结果为

 3 具体分析

1)在32位系统中,指针字节数是4字节

2)在64位系统中,指针字节数是8字节

 B的对齐模数   min(结构体中中最宽数据类型,操作系统指定对齐值) ===min(8,8)

a是double类型,占八字节,此时首地址大小为八字节,是自身类型的整数倍,

b是short类型,占二字节,此时首地址大小为十字节,是自身类型的整数倍,

c是int类型,占四字节,此时首地址大小为14字节,不是自身类型整数倍,保证首地址大小为自身类型整数倍,空两个字节,即b补2字节

d是char类型,占一字节,此时首地址大小为17字节,是自身类型整数倍,最后一个还要保证是对齐模数的整数倍,补7字节。

4规则:

1、确定分配单位(对齐模数):一行分配多少字节(min(value,结构体中 最大的基本类型长度))

2、成员的偏移量:相对于结构体的起始位置的偏移字节数(成员自身大小的整数倍)

3、结构体总大小:分配单位的整数倍。

每添加一个变量,对首地址大小来算,是否是自身变量的倍数,如果不是就补成它的倍数,最后一个变量结束看是否是对齐模数的倍数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值