[筆記] Visual C++ 的 Struct Memeber Alignment 問題與解決方法

在 Visual C++ 中,default 的 data alignment 是 4 bytes。舉例來說,這樣的一個 struct:

struct TestStruct
{
    char c;
    short s;
};

sizeof() 得到的結果是 4 而不是 3。這樣的特性是為了資料處理的速度;但若是我們直接把 object 內容當成 raw data 處理時,就會出現問題。

要更改 VC++ 對 struct member alignment 的處理方式有兩種方法。其一是更改 compile option "/Zp[num]",把 [num] 換成想要的 alignment boundary(可以選擇的數字有 1, 2, 4, 8, 16)。若是使用 IDE 的話,這個選項在 "Project -> Properties -> Configuration Properties -> C/C++ -> Code Generation -> Struct Member Alignment"。

但上述方法會影響到整個 project。如果只是希望某個 struct 不要 align 的話,可以在 struct 宣告的前後加上下列的 pragma:

#pragma pack(push,1)
struct TestStruct
{
    char c;
    short s;
};
#pragma pack(pop)

其中 push 的意思是先將原來的設定(可能是 4)暫存起來;而 pop 則是恢復原來的設定。