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



     

  • 相关阅读:
    安全机制
    Service
    ubuntu 16.4 安装配置IK6.3.2
    ubuntu openstack windows 镜像制作
    openstack RuntimeError: Unable to create a new session key. It is likely that the cache
    千帆过尽,野草依然
    shiro无法进入授权的方法org.crazycake.shiro.exception.PrincipalInstanceException: class java.util.HashMap must has getter for field: id
    绝望中的希望
    shrio中去掉 login;JSESSIONID
    method 'redisConnectionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError
  • 原文地址:https://www.cnblogs.com/bzsh/p/4362124.html
Copyright © 2011-2022 走看看