聯合體 位域結構體 C C 中的位域

2021-10-12 09:04:08 字數 1188 閱讀 8171

各種基本資料型別中,長度最小的 char 和 bool 在記憶體中占用乙個位元組的空間,但對於某些資料型別只需要幾個二進位制位即可儲存,例如:

enum gameresult ;
由於它只有四種取值,只需要兩個二進位制位就可儲存,而乙個 gameresult 型別變數至少要佔1個位元組(8個二進位制位),在很多編譯器中,甚至還會佔據更多的空間。單一變數所浪費的空間也許並不顯著,但如果乙個類中有多個這樣的資料成員,那麼他們所浪費的空間累加起來會很大。一種可以想到的解決辦法是,將類中多個這樣的資料成員「打包」,讓他們不必從整位元組開始,而是可以只佔據某些自己位元組的某幾位。為了解決這一問題,c++允許在類中宣告位域。

位域是一種將類中的多個資料成員打包,從而使不同成員可以共享相同的位元組的機制。在類定義中,位域的定義方式為:

資料型別說明符 成員名 :位數;

程式設計師可以通過冒號(:)後的位數來指定為乙個位域所占用的二進位制位數。使用位域,有以下幾點需要注意:

設計乙個結構體儲存學生的成績資訊,需要包括學號、年級和成績3項內容,學號的範圍是 0~99 999 999,年級分為 freshman, sophomore, junior, senior四種,成績包括a,b,c,d四個等級

分析:學號包括27個二進位制位(2^27 = 134 217 728)的有效資訊,而年級、成績各包括2個二進位制位有效資訊。如果用整型儲存學號,分別用列舉型別儲存年級和等級(各至少占用乙個位元組),則總共至少占用6位元組。如果採用位域,則需要 27 + 2 + 2 = 31 個二進位制位,只需4個位元組就能存下。

執行結果:

分別使用vc++.net 2005 和 gnu c++ 4.2 編譯,都可以得到以上結果,但在有些編譯器下,執行結果的第一行可能有所不同。

下圖顯示了上例中student類各資料成員所占用的空間分布:

聯合體 位域結構體 聯合體的妙用

在c語言中,變數的定義是分配儲存空間的過程。一般的,每個變數都具有其獨有的儲存空間,那麼可不可以在同乙個記憶體空間中儲存不同的資料型別 不是同事儲存 呢?答案是可以的,使用聯合體就可以達到這樣的目的。聯合體也叫共用體,在c語言中定義聯合體的關鍵字是union。定義乙個聯合型別的一般形式為 union...

聯合體,位域, 結構體對齊

聯合體union 當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體 union 在c programming language 一書中對於聯合體是這麼描述的 1 聯合體是乙個結構 2 它的所有成員相對於基位址的偏移量都為0 3 此結構空間要大到足夠容納最 寬 的成員 1下面解釋這四...

結構體或聯合體中的位域

struct 位域結構名 其中位域列表的形式為 型別說明符 位網域名稱 位域長度 例如 struct bs 位域變數的說明與結構變數說明的方式相同。可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如 struct bs data 說明data為bs變數,共佔兩個位元組。其中位域a佔8位,位...