看板 C_and_CPP 關於我們 聯絡資訊
code 寫到一半發現 struct / union 一堆問題, 由於問題很多也不好意思請求慢慢說明, 若有相關資訊請不吝提供,感激不盡。 [問題1] alignment - 1 struct , compiler 為加速處理,會進行 alignment, 若 struct 內之 member 所使用長度都一樣, 是不是就不會 alignment ? vc 是這樣,但這情形不知是否相依. ex: struct s1{ char a, b, c; }; // sizeof(s1) = 3 [問題2] alignment - 2 承上, 若是不同資料型態必會 aligmnent, struct s2{char a; int b;}; // sizeof(s2) = 8; 若要取消其 alignment , VC 下可用 #pragma pack(push, 1) ... #pragmapack(pop) 解決 #pargma pack(push, 1) struct s2{ char a; int b; }; // sizeof(s2) = 8 #pragma pack(pop) 但我想知道是否有其它「可攜性」(可移植性)方式可解決這問題? [問題3] 指定 bit 數問題 struct s3{ char a:4; int b:18; }; 若不考慮 alignment 問題, 仍佔 8 bytes, 那是不是代表 實際上 char 還是給它 1 byte, int 還是給它 4 bytes, 只是實際上會有「禁用」的效果? [問題4] 取 low/hi half byte 以 unsigned int 而言,取 low / hi 大多是用以下方式 #define GET_LOW(u) do( (u) & 0x0000ffff )while(0) #define GET_HI(u) do( ((u) & 0xffff0000)>>16 )while(0) 但我認為用 union 方式應會較快 (有 流言 指出, VS 下開 /O2 /Ot 時,用 union 並不會較快,待驗證) 於是 coding 下面這段 typedef unsigned short ushort; typedef unsigned int uint; struct HiLo{ ushort hi; ushort low; }; union{ uint num; struct HiLo hilow; }; 會遇到問題除了 [問題1] 之是否 alignment, 應是還要考慮 big-endian, little-endia, 於是用多了這些步驟 struct HiLo{ushort hi, low;}; struct LoHi{ushort low, hi;}; int IsBigEndian() { short v = 0x00ff; char *p = (char*)(&val); return *p==0; } void init() { # if IsBigEndian() # define HiLo LoHi # endif } int main() { init(); return 0; } 請問這種做法是否可行? 或是有其它較佳之作法可供參考? 問題真的很多,請各位不吝指教, 小弟感激不盡,謝謝各位! -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222 ※ 編輯: tropical72 來自: 180.177.73.222 (05/26 07:48)
angleevil:第二個問題,我找到用__attribute__((packed))的例子 05/26 09:47
angleevil:http://pastie.org/1974211 05/26 09:47
tropical72:__attribute__ 是gnu的東西,這和上述綁定vc是一樣的. 05/26 11:15