1. 程式人生 > >結構體記憶體對齊原則

結構體記憶體對齊原則

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
 3.舉例說明

例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的整數倍條件;