作者tropical72 (藍影)
看板C_and_CPP
標題[問題] struct alignment / endian
時間Thu May 26 07:45:01 2011
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
→ tropical72:__attribute__ 是gnu的東西,這和上述綁定vc是一樣的. 05/26 11:15