结构体数据对齐

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

考点:结构体数据对齐。算法

例一:默认状况下:ide

#include <iostream>
using namespace::std;

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

//#pragma pack(4) code

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\n",sizeof(A)); system("pause"); return 0; }

输出结果:blog

算法步骤:默认状况先按数据对齐,以后按总体对齐。内存

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

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

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\n",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对齐

相关文章
相关标签/搜索