C语言——结构体大小计数方法(结构体对齐)

目录

一、结构体计算方法(规则)

二、对齐方式浪费空间?

二、例子

#pragma pack()


结构体的大小不是成员类型大小的简单相加。需要考虑到系统在存储结构体变量时的地址对齐问题。

一、结构体计算方法(规则)

由于存储变量地址对齐的问题,结构体大小计算必须满足两条原则:

1.结构体成员的偏移量必须是成员大小的整数倍(0倍认为是任何数的整数倍)
2. 结构体大小必须是所有成员大小(数组,结构体除外)的整数倍。(结构体声明不算进去,但定义了变量就算进去)

二、对齐方式浪费空间?

浪费,但是按照计算机的访问规则,这样对齐大大提升了访问效率

二、例子

struct S1{
        char ch1;        //1       1
        char ch2;        //1       2
        int i;                //4        8     遵循第一条,逻辑偏移2,实际按照第1条对其规则,偏移4
};

//8

【ch1】 【ch2】 【】 【】        

【i】        【i】    【i】 【i】

struct S2{
        char ch1;        //1        
        int i;                //4
        char ch2;        //1
};

//如果按照第1条规则,应该是9,但是还要满足第2条规则,结构体大小必须是每个成员的整数倍
//12

【ch1】 【】 【】 【】

【i】      【i】【i】【i】

【ch2】 【】 【】 【】

struct S3{
        char ch;        //1
        int i;                //4
        char src[13];   //13
};

//1,8,21,因为21不是4的整数倍,所以是24
//24

struct S4{
        char ch;        //1
        int i;                //4
        struct s{                //8
                char ch1;
                int j;
        };
        float f;                //4
};

//遵循第2条,不算结构体声明,是12
//12

struct S4{
        char ch;        //1
        int i;                //4
        struct s{                //8
                char ch1;
                int j;
        }stmp; //定义了结构体,大小加进去,但是不算倍数
        float f;                //4
};

//遵循第2条,结构体定义了算进去,是20
//20

struct S5{
        char ch; //1
        int i;       //4
        union{        //4
                char ch1;
                int j;
        };
};

//联合体只算占用空间最大的union,是int 4个字节
//12

#pragma pack()

结构体最大对齐超过10就按10
没超过就按结构体最大的对齐

#pragma pack(4)
struct S6{
        char ch;        //1
        int i;        //4
        float f;        //4
        double d;   //8
};

//#pragma pack(4),对齐方式限制,有超过4的就按照4对齐,对齐4,所以是20,不是24

//20

#pragma pack(10)        //这里可能会有警告
      //warning: alignment must be a small power of two, not 10 [-Wpragmas]


 #pragma pack(16)        //改为16就没警告了
struct S7{
        char ch;        //1
        int i;        //4
        float f;        //4
        double d;   //8
};

//#pragma pack(10),对齐方式限制,没超过10,就按照最大的对齐,对齐8,所以是24

//24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dz小伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值