Day 10
1.
结构体中地址对齐
在一块连续的存储空间中 地址号码要能够整除数据类型所占大小 不然就要往下++1
设定0可以整除任何数
设下面有连续空间 struct 中存放 int char float 类型的内容 (不一定从0开始 这里只做说明用)
0 int开始 // 0%4 可以整除 从0地址开始
1
2
3 int结束
4 char开始 char结束 // 4%1 可以整除
5 // 5%4 不可以整除 所以float 不能从这里开始 ++1
6 // 6%4 不可以整除 所以float不能从这里开始
7 // 7%4 不可以整除 所以float不能从这里开始
8 float 开始 // 8%4 可以整除 所以float从这里开始
9
10
11 float 结束
12
13
由此可见 struct中数据的存放方式会影响struct的大小 5-7的空间以及不能另作它用 这也许是一种浪费 合理分配空间也是很必要的 当然 对齐可以通过特定的指令取消
一般函数在进行传参的时候不直接使用结构体 这样会加剧储存空间的开销(结构体很大时) 所以更好的方法是传指针(地址)
共用体与结构体的嵌套
可以利用 共用体的特性完成一些有趣的事情
因为共用体的特性,在同一时间,共用体中的数据只有一个有效 ! (是只有一个数据有效)
比如 我想计算一个32位数据的前两个字节和后两个字节的和 (这种问题在项目中有实际意义 比如对传感器回收数据的处理)
#include <stdio.h>
#include <stdlib.h>
union
{
struct
{
uint16_t i;
uint16_t j;
}
uint32_t y;
}a;
int main()
{
a.y=0x112223344;
printf(“%x\n”,a.x.i+a.x.j);
}
!!!因为共用体的特性 共用体所占空间中的数据只能有0x11223344 这一个 但是在事实上,0x11223344这个数据是实实在在的放在 共用体的那四个字节的空间中的 两个16位的数据和一个32位的数据都是四个字节 而用共用体中嵌套的struct 去表达0x112233444这个数据的时候,其实对于空间中的数据来说,只是换了一个表达形式,数据的唯一性没有遭到破坏
这对我们来说是值得拓展思维的一个点
位域
位域在嵌入式应用中是有价值的 但是要注意大端小端的问题 如果是小端的话 会出现负值问题 这是因为补码存放的特性
union
{
struct
{
char a:1;
char b:2;
char c:1;
}
int y;
}a;
可以利用第三条中描述的特性使用上述思想构造出的内容 比如给y赋值 但是能对数据进行更方便的位上的操作 但是还是那句话 要注意大端小端的问题
枚举 其实就是像是一个集合里放了很多宏 枚举怎么用?和结构体配合可以当作巨大的flag标志位来用(很紧凑) 在嵌入式中太有用了 也可以用来写交互内容