結構體數據對齊

原題:問該結構體輸出所佔內存大小。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對齊

相關文章
相關標籤/搜索