在開發中,有時候內存和存儲空間極其有限的狀況下(好比嵌入式等),常規的iOS對象存儲方式,對內存的開銷就不符合開發要求了,這時候,咱們會採用其餘的存儲方式:聯合體和位域。markdown
聯合體也叫共用體,是一種特殊的類,也是一種構造類型的數據結構。 在一個聯合體內可以定義多種不一樣的數據類型。一個被說明爲該聯合體類型的變量中。贊成裝入該聯合體所定義的不論什麼一種數據。這些數據共享同一段內存,以達到節省空間的目的。數據結構
分析:根據以上demo,UnionTest方法中,按照聯合體特性bit的大小應該是8字節(由Double決定的),a和b的地址應該是相同的,而且先給a賦值,再給b賦值,那麼b的值會將a的值覆蓋。spa
有些信息在存儲時,並不須要佔用一個完整的字節,而只需佔幾個或一個二進制位。 例如在存放一個開關量時,只有 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語言的一種特殊運算功能, 它是以二進制位爲單位進行運算的。
位運算符只有邏輯運算和移位運算兩類。位運算符能夠與賦值符一塊兒組成複合賦值符。 如&=,|=,^=,>>=,<<=等。開發
② 利用位運算能夠完成彙編語言的某些功能,如置位,位清零,移位等。還可進行數據的壓縮存儲和並行運算。
③ 位域在本質上也是結構類型,不過它的成員按二進制位分配內存。其定義、說明及使用的方式都與結構相同。
④ 位域提供了一種手段,使得可在高級語言中實現數據的壓縮,節省了存儲空間,同時也提升了程序的效率。
union Isa {
Class cls;
struct Bits {
int a : 2;
int b : 4;
int c : 4;
}bits;
};
複製代碼
以上示例中,便是聯合體位域的一種結構。
聯合體Isa中的cls和bits只能有一個是有值,從而節省了空間,而bits又是位域,能存儲不少數據,節省空間,因此聯合體位域可以大大的節省空間。