结构体和共用体字节对齐

转载自https://www.cnblogs.com/wylnii/p/byte-align-cross-platform.html

视频更详细:1.结构体大小的计算方法 

                     2. 设置内存对齐字节数

举例:8字节对齐

 1 #pragma pack(push) //保存对齐状态
 2 #pragma pack(8)
 3 struct node
 4 {
 5     char ch;     // 1     Byte
 6     short sh;    // 2     Bytes
 7     int in;        // 4      Bytes
 8     float f;      //4
 9     double db // 8
10     char *p    //4 在32bits机器中所有指针4字节
11    char arr[5];//数组和5个单独类型相等,相当列出5个char在根据原则对齐
12 }
13 #pragma pack(pop)//恢复对齐状态 

结果为:占用8*5=40字节

补全原则:补全后是2 4 8的倍数即可

对齐原则:没有满要求对齐的格子要补齐,一个类型必须能整体取出,对齐满足基数

对齐基数:pack(n)和成员中类型占字节最大者(m),二者中取其小者为基数,即 MIN ( n , m);

举例:4字节对齐

 1  #pragma pack(push) //保存对齐状态
 2  #pragma pack(8)
 3  struct node
 4 {
 5      char ch;     // 1     Byte
 6      short sh;    // 2     Bytes
 7      int in;        // 4      Bytes
 8      float f;      //4
 9      double db // 8
10      char *p    //4 在32bits机器中所有指针4字节
11     char arr[5];//数组和5个单独类型相等,相当列出5个char在根据原则对齐
12 }
13 #pragma pack(pop)//恢复对齐状态 

结果为:占用4*8=32字节

优缺点衡量:1.对齐满足 成员最大字节数(m)为基数的话可以增快内存的读取速度,程序效率高,但占空间大,以空间换时间。

                    2.对齐满足 MIN(n,m),即设置的手动对齐字节(n)可能比成员最大字节要小,则能省下空间,但内存读取效率降低,以时间换空间。

      3.实际工作中要看项目要求来取舍,鱼和熊掌不可兼得。

原文地址:https://www.cnblogs.com/ycpkbql/p/9020711.html