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无意义位段(重要,嵌入式方向)
不是另起一个存储单元,是被压缩的。占用两个字节的意思,使之无法使用