结构体&&联合体--又来搞基

研究问题:

  1. 结构体、联合体基本概念?
  2. 结构体&&联合体为什么搞基?
  3. 关于结构体、联合体中涉及到的内存对齐?

要点:

  • 结构体是数据项的集合,每条结构体项由其类型和名称制定。

      联合体是所有成员共用一个空间;使用的是同一个起始地址。这样,后来的数据就会覆盖先前的数据。所有联合体union的大小只配置一个足够大来容纳联合体成员中最大长度数据成员类型的大小;​
      来自 http://blog.sina.com.cn/s/blog_b0a23f620102vl07.html
      

  • 结构体struct、联合体union区别?
     1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息。
     2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在。
     3.对于Union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct 的不同成员赋值 是互不影响的。
     注:在很多地方需要对结构体的成员变量进行修改。只是部分成员变量,那么就不能用联合体Union,因为Union的所有成员变量占一个内存。eg:在链表中对个别数值域进行赋值就必须用struct.
     来自 https://www.cnblogs.com/webber1992/p/5950199.html
     
  • 结构体的内存对其原则
     原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

     原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)

     原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

     1) 结构体变量的地址一定够被其最宽基本类型成员的大小所整除
    如:

Struct stud
{
    Int aChar bDouble c
}stu;

 其大小必须被c的类型double整除。故其大小为4+1+8=13;但实际上是16.

 2)结构体每一个成员相对应结构体首地址的偏移量offset都是成员大小的整数倍,如果不够,必须在成员名上,补充相应的位置

  计算的基本规则:
  结构体元素是按照一个一个顺序放入内存的,但是并不是紧密的排列。从结构图的首地址开始,每一个元素都放到内存中时,都会认为内存给自己分配了空间,异常元素存放的位置一定是自己宽度的整数倍。首地址一般是为int或double型

  经过原则1之后,检查计算出的存储单元是否是所在结构体元素最宽元素类型长度的整数倍,如果是,则结束,如果不是则补齐为整数倍。

PS:只要是在32位系统中,指针变量都占4个字节。无论其指针的类型是什么。


    union u
    {
    double a;
    int b;
    };
    union u2
    {
    char a[13];
    int b;
    };
    union u3
    {
    char a[13];
    char b;
    };
    cout<<sizeof(u)<<endl; // 8
    cout<<sizeof(u2)<<endl; // 16
    cout<<sizeof(u3)<<endl; // 13

  都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员int b。由于int类型成员的存在,使u2的对齐方式变成4,也就是说,u2的大小必须在4的对界上,所以占用的空间变成了16(最接近13的对界)。
 来自 https://www.cnblogs.com/webber1992/p/5950199.html

  • 联合体的内存对其原则
     union的长度取决于其中的长度最大的那个成员变量的长度。即union中成员变量是重叠摆放的,其开始地址相同。
     其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:
      1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;
      2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除关系,该最大空间自动延伸;
    union   mm{    
      char   a;//元长度1    
      int   b[5];//元长度4    
      double   c;//元长度8    
      int   d[3];    
  };  

  sizeof(mm)=24=8(因为[1+4]<8取8)+8+8(因为3<8取8)
 来自 http://blog.csdn.net/u010479322/article/details/51137907

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章