结构体 & 位段 & 联合 &枚举

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;
}



猜你喜欢

转载自blog.csdn.net/weixin_39294633/article/details/79840384