OC對象原理探究(下)—— 聯合體(共用體)與位域

在開發中,有時候內存和存儲空間極其有限的狀況下(好比嵌入式等),常規的iOS對象存儲方式,對內存的開銷就不符合開發要求了,這時候,咱們會採用其餘的存儲方式:聯合體和位域。markdown

1、認識聯合體

一、什麼是聯合體

聯合體也叫共用體,是一種特殊的類,也是一種構造類型的數據結構。 在一個聯合體內可以定義多種不一樣的數據類型。一個被說明爲該聯合體類型的變量中。贊成裝入該聯合體所定義的不論什麼一種數據。這些數據共享同一段內存,以達到節省空間的目的。數據結構

二、聯合體的兩個特性

  • ① 在union中,分配內存空間的大小,等於佔內存最大的數據類型字節大小。
  • ② 共享同一段內存,成員變量的賦值操做,其餘的成員變量原有數據將成爲髒數據,不能共存。

三、驗證聯合體特性

在這裏插入圖片描述

分析:根據以上demo,UnionTest方法中,按照聯合體特性bit的大小應該是8字節(由Double決定的),a和b的地址應該是相同的,而且先給a賦值,再給b賦值,那麼b的值會將a的值覆蓋。spa

2、認識位域

一、什麼是位域

有些信息在存儲時,並不須要佔用一個完整的字節,而只需佔幾個或一個二進制位。 例如在存放一個開關量時,只有 0 和 1 兩種狀態,用一位二進位便可。爲了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱爲「位域」或「位段」。—— 引用自[譚浩強老師的《C語言程序設計》]設計

二、位域的定義和使用說明

  • 位域的定義和結構體有些類似,其通常形式爲:
struct struct_name { 
	位域列表    //格式爲:[類型說明符 位域名:位域長度]
 };
複製代碼
  • 例以下面這樣定義一個位域:
struct bits {
	int a:8;
	int b:2;
	int c:6;
}data;
複製代碼

分析:上述位域,說明 data 爲 bits 變量,共佔兩個字節,16位。其中位域 a 佔 8 位,位域 b 佔 2 位,位域 c 佔 6位。code

  • 注意:對於位域的定義尚有如下幾點說明:

① 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另外一位域時,應從下一單元起存放該位域。也能夠有意使某位域從下一單元開始。orm

② 因爲位域不容許跨兩個字節,所以位域的長度不能大於一個字節的長度,也就是說 不能超過 8 位二進位。對象

③ 位域能夠無位域名,這時它只用來做填充或調整位置。無名的位域是不能使用的。圖片

struct bits {
	unsigned a:4
	unsigned :0 /*空域*/
	unsigned b:4 /*從下一單元開始存放*/
	unsigned c:4
}
複製代碼

以上,a 佔第一字節的 4 位,後 4 位填 0 表示不使用,b 從第二字節開始,佔用 4 位,c 佔用 4 位。內存

struct bits {
	int a:1
	int :2 /*該 2 位不能使用*/
	int b:3
	int c:2
};
複製代碼
綜上例子分析:位域在本質上就是一種結構類型,不過其成員是按二進位分配的。

三、關於位域的總結

① 位運算是C語言的一種特殊運算功能, 它是以二進制位爲單位進行運算的。

位運算符只有邏輯運算和移位運算兩類。位運算符能夠與賦值符一塊兒組成複合賦值符。 如&=,|=,^=,>>=,<<=等。開發

② 利用位運算能夠完成彙編語言的某些功能,如置位,位清零,移位等。還可進行數據的壓縮存儲和並行運算。
③ 位域在本質上也是結構類型,不過它的成員按二進制位分配內存。其定義、說明及使用的方式都與結構相同。
④ 位域提供了一種手段,使得可在高級語言中實現數據的壓縮,節省了存儲空間,同時也提升了程序的效率。

3、聯合體位域

  • 瞭解了上面的聯合體、位域,下面看看聯合體位域。其實,聯合體位域就是聯合體和位域組合成的結構。
union Isa {
    Class cls;
    struct Bits {
        int a : 2;
        int b : 4;
        int c : 4;
    }bits;
};
複製代碼
以上示例中,便是聯合體位域的一種結構。
聯合體Isa中的cls和bits只能有一個是有值,從而節省了空間,而bits又是位域,能存儲不少數據,節省空間,因此聯合體位域可以大大的節省空間。
相關文章
相關標籤/搜索