結構體記憶體對齊原則
1.結構體對齊含義
Ø 結構體的儲存結構
Ø 結構體的總大小(sizeof)
2.結構體對齊原則
Ø 結構體是按照成員定義順序儲存的
Ø 結構體第一個成員從offset為0的地址開始儲存
Ø 成員儲存起始地址必須滿足:min(“成員自身型別的模數”,“#pragam pack(x)”) 的整數倍,否則補齊直到滿足
Ø 結構體的總大小必須滿足:min(“結構體內部最大成員模數”," #pragam pack(x)")的整數倍,否則補齊直到滿足
Ø 當結構體作為其他結構體成員時,成員模數為”結構體內部最大成員模數“
表-1 各型別成員的長度及模數預設值
char | short | int | long |
double | long double | |
windows | 1 | 2 | 4 | 4 | 8 | 8 |
linux | 1 | 2 | 4 | 4 | 4 | 4 |
例1:無“#pragma pack(x)”巨集定義
typedef struct
{
char a;
char b;
double c;
short d;
}Test;
儲存結構:
因為無”#pragma pack()“巨集定義:
min("成員自身型別的模數","#pragma pack(x)")=“成員自身型別的模數”;
min(”結構體內部最大成員模數“,"#pragma pack(x)")="結構體內部最大成員模數";
成員a:模數為1,為第一個成員,offset地址為“Addr0”;
成員b:模數為1,“Addr1”滿足為1的整數倍條件;
成員c:模數為4,”Addr2“不滿足為4的整數倍條件,應取”Addr4“,並補齊”Addr2“、"Addr3";
成員d:模數為2,”Addr8“滿足為2的整數倍條件;
sizeof(Test):結構體內部最大成員模數為4,目前結構體長度為10,10不是4的整數倍,所以還需補齊2個位元組,總大小為12;
例2:有“#pragma pack(x)”巨集定義
#pragma pack(2)
typedef struct
{
char a;
char b;
double c;
short d;
}Test;
#pragma pack()
儲存結構:
成員a:模數為1,為第一個成員,offset地址為“Addr0”;
成員b:模數為1,min("成員自身型別的模數","#pragmapack(2)")=1,“Addr1”滿足為1的整數倍條件;
成員c:模數為4,min("成員自身型別的模數","#pragmapack(2)")=2,”Addr2“滿足為2的整數倍條件;
成員d:模數為2,min("成員自身型別的模數","#pragmapack(2)")=2,”Addr6“滿足為2的整數倍條件;
sizeof(Test):結構體內部最大成員模數4,min(結構體內部最大成員模數,"#pragmapack(2)")= 2,目前結構體長度為8,滿足2的整數倍條件;