【转载】5分钟搞定内存字节对齐

转载自:https://blog.csdn.net/vincent_1011/article/details/4479965

转载:http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx

请牢记以下 3 条原则:(在没有 #pragma pack 宏的情况下)

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

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

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

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

typedef struct bb
{
    int id;            //[0]....[3]
    double weight;     //[8].....[15]  原则1
    float height;      //[16]..[19], 总长要为 8 的整数倍,补齐[20]...[23]  原则 3
}BB;

typedef struct aa
{
    char name[2];     //[0],[1]
    int  id;          //[4]...[7]    原则1

    double score;     //[8]....[15]    
    short grade;      //[16],[17]        
    BB b;             //[24]......[47] 原则2
}AA;

int main()
{
     AA a;
     cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
     return 0;
}

结果是

48 24
ok,上面的全看明白了,内存对齐基本过关.

再讲讲 #pragma pack().

在代码前加一句 #pragma pack(1)。你会很高兴的发现,上面的代码输出为

32 16
bb 是 4+8+4=16,aa 是 2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照 1 的整数倍对齐,换句话说就是没有对齐规则.

明白了不?

那 #pragma pack(2) 的结果又是多少呢?对不起,5分钟到了,自己去测试吧.

(PS:我在 win10_64 c++ codeblock 下测了,结果是会变成是 2 的倍数,即按 2 对齐)

===============================================================

一会搞定 union 内存字节对齐

也是转载一个论坛的回复:

其实 union (共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点:  
  1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间;  
  2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例 int   a[5] 为 4 )不满足整除关系,该最大空间自动延伸;  
   
  我们来看看这段代码:  

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

  本来mm的空间应该是 sizeof(int) * 5 = 20,但是如果只是 20 个单元的话,那可以存几个 double 型(8位)呢?两个半?当然不可以,所以 mm 的空间延伸为既要大于20,又要满足其他成员所需空间的整数倍,即 24  
   
  所以 union 的存储空间先看它的成员中哪个占的空间最大,拿他与其他成员的元长度比较,如果可以整除,ok

reference:https://www.cnblogs.com/cnjy/p/3820831.html

猜你喜欢

转载自blog.csdn.net/yld10/article/details/80262555