聯合體結合位域使用技巧


偶然在代碼中看到這樣一個定義:

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,它與結構體的區別是:聯合體的所有成員占用同一塊的內存,這塊內存的大小(聯合體的大小)取決於成員之中占用空間最大的。且聯合體中的所有成員變量的起始地址相同,畫個圖來解釋一下:

image-20210519192522914

​ 圖中表示的是一個Header實體的內存占用情況,可以看到成員變量byte和結構體bits的起始地址是相同的,均為該聯合體實體的起始地址。由於兩個成員的占用空間都分別是1 Byte,故整個Header實體的占用空間大小也是1 Byte。


​ 這樣做的好處就是當我們處理一幀報文的時候,由於用於存儲報文的內存大多是按字節存儲的,故可以直接對byte成員賦值,不需要再對每個字節進行切割再分別賦值。

image-20210519193814839


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM