结构体数据对齐

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

考点:结构体数据对齐。

例一:默认情况下:

#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;
}

输出结果:

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

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

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



 

posted @ 2015-03-24 11:44  白纸书画  阅读(618)  评论(0编辑  收藏  举报