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对齐



     

  • 相关阅读:
    防止重复点击
    刷新当前页面的几种方法
    PHP删除数组中空值
    json转化数组
    两个不能同时共存的条件orWhere查询
    SQLSTATE[42000]
    laravel一个页面两个表格分页处理
    Hash::make与Hash::check
    unbind()清除指定元素绑定效果
    二级联动
  • 原文地址:https://www.cnblogs.com/bzsh/p/4362124.html
Copyright © 2011-2022 走看看