【带头学C++】----- 六、结构体 ---- 6.7 结构体的对齐规则

目录

6.7 结构体的对齐规则

6.7.1 知识点引入

​6.7.2 结构体自动对齐规则

1、确定分配单位(一行分配多少字节)

2、确定成员的偏移量

3、收尾工作

​6.7.3 强制对齐规则

1、确定分配单位(一行分配多少字节)

2、确定成员的偏移量

3、收尾工作

6.8结构体的位域

6.8.1结构体位域的概述

6.8.2另起一个存储单元

​6.8.3无意义位段(重要,嵌入式方向)

6.8.4 案例


6.7 结构体的对齐规则

6.7.1 知识点引入


6.7.2 结构体自动对齐规则

1、确定分配单位(一行分配多少字节)

结构体中最大的基本类型长度决定

2、确定成员的偏移量

成员偏移量=成员自身类型的整数倍

       需要根据你所在平台的位数,32位和64为类型大小不一样。cpu一次读取的大小也不一样,32位是一次读取4字节,64位是一次读取8字节。占用的大小的字节数也不一致的,需要经常记忆。

3、收尾工作

结构体的总大小=分配单位整数倍

复习带背书:

在32位系统中:

  • char:1 字节
  • short:2 字节
  • int:4 字节
  • long:4 字节
  • float:4 字节
  • double:8 字节
  • long long:8 字节
  • 指针类型:4 字节(在32位系统中,指针类型的大小与 int 类型相同)
  • 数组类型:数组在内存中占用的字节大小为 T * N。例如
  • int arr[10]
  • int: 4*10

在64位系统中:

  • char:1 字节
  • short:2 字节
  • int:4 字节
  • long:8 字节
  • float:4 字节
  • double:8 字节
  • long long:8 字节
  • 指针类型:8 字节(在64位系统中,指针类型的大小与 long 类型相同)
  • 数组类型:数组在内存中占用的字节大小为 T * N


6.7.3 强制对齐规则

#pragma pack(value)时的指定对齐值value。注意value值为1  2  4  8  16

1、确定分配单位(一行分配多少字节)

分配单位 = min(结构体中最大的基本类型,value)

2、确定成员的偏移量

成员偏移量=成员自身类型的整数倍

3、收尾工作

结构体的总大小=分配单位整数倍

案例1:

案例2:

6.8结构体的位域

6.8.1结构体位域的概述

在结构体中,以位为单位的成员,咱们称之为位段(位域)

struct packed data{
     unsigned int a:2;
     unsigned int b:6;
     unsigned int c:4;
     unsigned int d:4;
     unsigned int i;
}data;

a的类型是unsignedint a的大小只占2位二进制位

没有非位域隔开的位域叫相邻位域。

相同类型的相邻位域可以压缩。但是压缩的位数 不能超过自身类型的大小。

不要对位域取地址,位域是以二进制段为存储,没有内存的概念

对位域赋值  不要操作 位域本身位的宽度

6.8.2另起一个存储单元

(这里对于嵌入式作用很大,学习内容有点偏嵌入式底层学习,所有学会struct基本怎么使就行了,位域无所谓的,可以不学) 


6.8.3无意义位段(重要,嵌入式方向)

不是另起一个存储单元,是被压缩的。占用两个字节的意思,使之无法使用

6.8.4 案例

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序小白Erike.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值