C++:struct和union 内存字节对齐问题

转自:http://blog.csdn.net/wangyanguiyiyang/article/details/53312049

struct内存对齐问题

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,之后每一个数据成员存储的起始位置要从该成员大小的整数倍开始(好比int在32位机为4字节,则要从4的整数倍地址开始存储。

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

3:结构体总大小:也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

例1.

 1 typedef struct AA{
 2  int aa1;         //[0]....[3]
 3  double aa2;      //[8].....[15]
 4  float aa3;       //[16]..[19] 原则3:结构体总大小,总长要为8的整数倍,补齐[20]...[23]
 5 };
 6 typedef struct BB
 7 {
 8  char bb1[2];      //[0],[1]
 9  int  bb2;         //[4]...[7]         
10  double bb3;       //[8]....[15]    
11  short bb4;        //[16],[17]        
12  AA a;             //[24]......[47] 原则2,内部对象为结构体      
13  };

结果:

1 24 48

 

union内存字节对齐

 

其实union(共用体)的各个成员是以同一个地址开始存放的,每个时刻只能够存储一个成员,这样就要求它在分配内存单元时候要知足两点:

1.通常而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;

2.如果该最长的存储空间对其余成员的元类型(若是是数组,取其类型的数据长度,例int   a[5]为4)不知足整除关系,该最大空间自动延伸; 

咱们来看看这段代码:

1 union   mm{  
2     char   a; //元长  度1  
3     int   b[5];//元长度4  
4     double   c;//元长度8  
5     int   d[3];  
6   };  

   原本mm的空间应该是sizeof(int)*5=20;可是若是只是20个单元的话,那能够存几个double型(8位)呢?两个半?

   固然不能够,因此mm的空间延伸为既要大于20,又要知足其余成员所需空间的整数倍,即24 因此union的存储空间先看它的成员中哪一个占的空间最大,拿他与其余成员的元长度比较,若是能够整除

相关文章
相关标签/搜索