偶然在代碼中看到這樣一個定義:
typedef union
{
unsigned char byte; /**< the whole byte */
struct
{
unsigned int retain : 1; /**< retained flag bit */
unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */
unsigned int dup : 1; /**< DUP flag bit */
unsigned int type : 4; /**< message type nibble */
} bits;
} Header;
我在實際開發的時候很少用到和看到聯合體和位域的出現,正好借這個機會學習一下。
#位域
使用位域的主要目的是節約存儲空間,可能某些情況下成員變量只能取幾個值,那么則不需要使用一個字節甚至更大的空間去存放它。
舉個例子,在上面的結構體 bits 中,qos 這個成員變量只能取0,1,2這三個值,那么我們可以在其定義后面加: 2 來表示其只占用2 bit 的內存,故取值范圍是[0, 3],滿足我們的要求。其它變量如 retain,dup 僅可取0或1,則只需給他們分配1 bit 的內存就可以。這樣下來,整個 bits 結構體僅占用一個字節內存。
#聯合體
聯合體的關鍵字是union,它與結構體的區別是:聯合體的所有成員占用同一塊的內存,這塊內存的大小(聯合體的大小)取決於成員之中占用空間最大的。且聯合體中的所有成員變量的起始地址相同,畫個圖來解釋一下:

圖中表示的是一個Header實體的內存占用情況,可以看到成員變量byte和結構體bits的起始地址是相同的,均為該聯合體實體的起始地址。由於兩個成員的占用空間都分別是1 Byte,故整個Header實體的占用空間大小也是1 Byte。
這樣做的好處就是當我們處理一幀報文的時候,由於用於存儲報文的內存大多是按字節存儲的,故可以直接對byte成員賦值,不需要再對每個字節進行切割再分別賦值。
