[VC] 結構的對齊 struct member alignment

compiler為了程式的執行效率,大都會對程式進行最佳化的動作,在結構中則會進行資料對齊以加快執行速度,作業系統、Compiler、CPU都影響資料對齊的邊界 (boundary alignment)。

Wiki – Data structure alignment 說明

來看看這個例子:

 
struct
{
 char c1;  //1 bytes
 char c2;  //1 bytes
 int  i1;  //4 bytes
 char c3;  //1 bytes
}S;

在 VC 預設情況下, 可以看到資料對齊的情況確實存在:

void* address_c1 = &S.c1;
void* address_c2 = &S.c2;
void* address_i1 = &S.i1;
void* address_c3 = &S.c3;
int sizeof_S = sizeof(S);

Screenshot_031516_103314_AM

在關閉資料對齊後的情況:

void* address_c1 = &S.c1;
void* address_c2 = &S.c2;
void* address_i1 = &S.i1;
void* address_c3 = &S.c3;
int sizeof_S = sizeof(S);

Screenshot_031516_103534_AM

 

要關閉結構資料對齊有下列兩個方法,

方法一,關閉單一結構的資料對齊:

#pragma pack(push)  //push current alignment to stack
#pragma pack(1)     //set alignment to 1 byte boundary
struct
{
 char c1;
 char c2;
 int i1;
 char c3;
}S;
#pragma pack(pop)  //resotre orginal alignment from stack

方法二,關閉整個 project 的結構資料對齊:

Untitled_Clipping_031516_103848_AM

 

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *