zoukankan      html  css  js  c++  java
  • 结构体和共用体字节对齐

    转载自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.实际工作中要看项目要求来取舍,鱼和熊掌不可兼得。

  • 相关阅读:
    [TJOI2007]小朋友
    弦图小结
    Bzoj2141: 排队
    [SYZOI Round1] 滑稽♂树
    Bzoj2244: [SDOI2011]拦截导弹
    Bzoj1492: [NOI2007]货币兑换Cash(不单调的斜率优化)
    Bzoj1495: [NOI2006]网络收费
    Bzoj1496: [NOI2006]千年虫
    Bzoj1498&1416: [NOI2006]神奇的口袋
    Bzoj4553: [Tjoi2016&Heoi2016]序列
  • 原文地址:https://www.cnblogs.com/ycpkbql/p/9020711.html
Copyright © 2011-2022 走看看