zoukankan      html  css  js  c++  java
  • 结构体数据对齐

    原题:问该结构体输出所占内存大小。

    考点:结构体数据对齐。

    例一:默认情况下:

    #include <iostream>
    using namespace::std;

    /*
    * pack( [show] | [push | pop] [identifier], n )
    *show,push,pop,identifier为可选参数,由编译器进行负责
    *n默认以结构体变量类型最大为对齐大小。
    */

    //#pragma pack(4) 

    typedef struct _A{
      char a;
      int b;
      float c;
      double d;
      int *pa;
      char* pc;
      short e;
    }A;
    int main(int argc, char *argv[])
    {
      printf("size = %d
    ",sizeof(A));
      system("pause");
      return 0;
    }

    输出结果:

    算法步骤:默认情况先按数据对齐,之后按整体对齐。

    数据对齐:按变量类型长度对齐

    a=1->a%1=0;->a=1 补0  按长度1对齐

    b=4->(a+b)%4=1; ->a+3+b=8  补3 按长度4对齐 

    c=4->(a+3+b+c)%4=0;->a+3+b+c=12 补0 按长度4对齐

    d=8->(a+3+b+c+d)%8=4;-> a+3+b+c+d+4=24 补4  按长度8对齐

    pa=4->(a+3+b+c+d+4+pa)%4=0;-> a+3+b+c+d+4+pa=28 补0  按长度4对齐

    pc=4->(a+3+b+c+d+4+pa+pc)%4=0;-> a+3+b+c+d+4+pa+pc=32 补0  按长度4对齐

    e=2->(a+3+b+c+d+4+pa+pc+e)%2=0;-> a+3+b+c+d+4+pa+pc+e=34 补0  按长度2对齐

    整体对齐:按结构体变量类型当中长度最大进行对齐。

    a+3+b+c+d+4+pa+pc+e%8=2  ;->a+3+b+c+d+4+pa+pc+e+6=40 补6 按长度8对齐

    例二:指定长度大小4对齐。

    #include <iostream>
    using namespace::std;
    /*
    * pack( [show] | [push | pop] [identifier], n )
    *show,push,pop,identifier为可选参数,由编译器进行负责
    *n默认以结构体变量类型最大为对齐大小。
    */
    #pragma pack(4)                                                   
    typedef struct _A{
      char a;
      int b;
      float c;
      double d;
      int *pa;
      char* pc;
      short e;
    }A;
    int main(int argc, char *argv[])
    {
      printf("size = %d
    ",sizeof(A));
      system("pause");
      return 0;
    }
    

    算法步骤:按指定对齐长度大小(4)对齐:

    a=1->a%4=1;->a+3= 补3  按长度4对齐

    b=4->(a+3+b)%4=0; ->a+3+b=8  补0 按长度4对齐 

    c=4->(a+3+b+c)%4=0;->a+3+b+c=12 补0 按长度4对齐

    d=8->(a+3+b+c+d)%4=0;-> a+3+b+c+d=20 补0  按长度4对齐

    pa=4->(a+3+b+c+d+pa)%4=0;-> a+3+b+c+d+pa=24 补0  按长度4对齐

    pc=4->(a+3+b+c+d+pa+pc)%4=0;-> a+3+b+c+d+pa+pc=28 补0  按长度4对齐

    e=2->(a+3+b+c+d+4+pa+e)%4=2;-> a+3+b+c+d+4+pa+e+2=32 补2  按长度4对齐



     

  • 相关阅读:
    SQL Server 2005 上安装SQL Server Management Studio
    小心博客被Google点名为有恶意软件
    新文章尚邮使用评论 ,包含Gmail的设置以及存在的一些问题
    发布一小软件
    在 ASP.NET 上实现锁定表头、支持滚动的表格的做法
    怎样检测网络中的电脑是否有安装SQL 2000
    危险字符过滤的类
    通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行(转载)
    javascript控制页面控件隐藏显示的两种方法
    整理的一些Tsql(二)
  • 原文地址:https://www.cnblogs.com/bzsh/p/4362124.html
Copyright © 2011-2022 走看看