close
union就是變數共用相同的記憶體空間. winsock的in_addr結構是一個不錯的例子:

struct in_addr {
  union {
     struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
     struct { u_short s_w1,s_w2; } S_un_w;
     u_long S_addr;
  } S_un;
};

union裡總共有三個定義, 因為都是4 byte, 因此這個union的大小便是4 byte (否則以最大的為準). 假設S_addr的值是0x12345678, 在Intel CPU的記憶體裡, 排列方式便是:

0x78, 0x56, 0x34, 0x12

因此s_b1=0x78, s_b2=0x56, s_b3=0x34, s_b4=0x12, 至於s_w1與s_w2便是分別取{0x78,0x56}與{0x34,0x12}形成短整數, 於是s_w1=0x5678, s_w2=0x1234

OleVariant結構是比較複雜一點的union, 利用一個變數值來決定後面應使用的union結構, 你可以研究看看. 以下是我寫的PDF parser其中的一段定義:

class PDFObject
{
private:
int m_Type; // 物件形態
union
{
bool m_Boolean; // 布林值
long m_Integer; // 整數
double m_Real; // 實數
ObjectRef m_Ref; // 物件參用形式
char* m_String; // 字串/名稱/Token
WgArray_PDFObject *m_Array; // 陣列物件
PDFDictionary *m_Dict; // 詞典物件
PDFStream *m_Stream; // 串流物件
};
public:
 ...
};

利用m_Type的值來決定使用後面的那個變數. 因為一次只可能有一種形態, 採用union會比較省空間.


from:
http://www.programmer-club.com.tw/ShowSameTitleN/cb/12971.html
arrow
arrow
    全站熱搜

    天才R 發表在 痞客邦 留言(0) 人氣()