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