1 结构体struct
结构体是一种自定义类型,可以通过“.”和“->”实现直接或间接的访问
结构体的内存对齐
内存对齐会浪费空间,那为什么要有内存对齐呢?
以“空间换时间”
1 对于不对齐的内存,访问数据时可能需要2次读取才能够拿到真正的内容
但在内存对齐时,访问数据只需要一次就可以
2 在硬件方面,规定只能从偶数开始读写
内存对齐规则
1 第一个成员放在0偏移处
2 从第二个成员开始,要对齐到【对齐数】的整数倍
【对齐数】:成员自身大小和默认对齐数的较小值
【默认对齐数】:win-vs-8 linux-4
3 结构体的总大小必须是最大对齐数的整数倍
下面我们计算结构体的大小来感受一下其中的内存对齐
struct S
{
char c; //0
double d; //8-15
int i; //16-19
};//24
struct A
{
char c1; //0
struct S s; //8 - 31
double d1; //32 - 39
char c2; //40
};//48
2 位段
注意一点:位段是不能跨平台使用的
3 联合union
联合也称共用体,共用一块空间
联合在内存分配时,也存在内存对齐的现象
union UN
{
int i;
char c[5];
};//UN大小为8个字节
在判断是大端字节序存储还是小端字节序存储时,利用联合体就很容易:
int check_sys()
{
union S
{
char c;
int i;
}s;
s.i = 1;
return s.c;
}