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);
在關閉資料對齊後的情況:
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);
要關閉結構資料對齊有下列兩個方法,
方法一,關閉單一結構的資料對齊:
#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 的結構資料對齊: