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

| 有 0 篇回應文章 | 被引用了 0 次

在 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" 則是恢復原來的設定。

此文章所屬分類:

沒有人引用這篇文章

本篇文章的引用網址:http://www.cclo.idv.tw/cgi-bin/mtos_4.1/mt-tb.cgi/96

留下您的意見

關於這位部落客

  • closer
  • 被人叫大叔的年紀。
  • 滿地撿得到的資訊工程師。
  • 喜歡酒精、搖滾樂、電影、電玩、漫畫、電腦、棒球、拍照、女孩子。
  • 討厭薑、青椒、芋頭、政客、煙味、キャプテン翼、張學友。
  • 會中文、英文、日文、客家話、河洛話、C 語言。

活動支援

關於這篇文章

這篇文章是 closerJune 20, 2008 4:51 PM 發表的。

前一篇文章:《每個男人心中都有一個搖滾少年

後一篇文章:《我的前世情人

回到本站首頁,或是檢視所有的文章彙整列表

Powered by Movable Type 4.1