首先,引入兩個概念“數據類型大小”和“指定對齊值”:
數據類型大小:char 為1 個字節,short 為2 個字節,int 為4 個字節,double為8 個字節等等;
指定對齊值:#pragma pack (value) 所指定的對齊的值,例如g++ 4.5.2 x86 默認值為4;
引入一個重要的概念——有效對齊值N:
有效對齊值N =min( (1), (2)),即:“數據類型大小”與“指定對齊值”的最小值。
在C / C++ 語言中,需要同時滿足如下A、B兩個條件:
條件A:結構體(struct)的數據成員的 起始地址addr_start 需要是有效對齊值N的整數倍,即addr_start % N == 0;
條件B:結構體(struct)的大小必須是 所有成員變量的最大有效對齊值max_N 的整數倍,即sizeof(struct) % max_N == 0。
例如:
struct a {
char a1;
short a2;
short a3;
double a4;
int a5;
char a6;
};
筆者機器的默認指定對齊值為4,分析:
a1 的有效對齊值為1,起始地址為0,占1 個字節;
a2 的有效對齊值為2,由於條件A,起始地址為2,a1與a2之間 空1 個字節,a2占2 個字節;
a3 的有效對齊值為2,由於條件A,起始地址為4,沒有間隔,a3 占2 個字節;
a4 的有效對齊值為4,由於條件A,起始地址為8,沒有間隔,a4 占8 個字節;
a5 的有效對齊值為4,由於條件A,起始地址為12,沒有間隔,a4 占4 個字節;
a6 的有效對齊值為1,由於條件A,起始地址為15,沒有間隔,a5 占1 個字節;
由於條件B,最大有效對齊值為4,總長度為4 的倍數, 結構體最後補3 個字節。
所以,上述結構體總共大小為24 個字節
摘自:楊卓荦的技術專欄