聯合體union的每一位表示一個信息叫做聯合體位域
聯合體
聯合體也叫共用體,由不同的數據類型組成,其變量互斥,存儲方式是所有成員共用一個段內存,共同體同一時刻只能保存一個成員的值,如果對新的成員賦值,就會將原來成員的值覆蓋掉。
結構體
結構體是把不同的數據組合存儲成一個整體,存儲方式是所有成員組合存儲,每個成員都分別占用一個內存。
聯合體與結構體的區別
- 內存占用情況
- 結構體的各個成員會占用不同的內存,互相之間沒有影響
- 共用體的所有成員占用同一段內存,修改一個成員會影響其余所有成員
- 內存分配大小
- 結構體內存 >= 所有成員占用的內存總和(成員之間可能會有縫隙)
- 共用體占用的內存等于最大的成員占用的內存
優缺點:
優點:
- 節省空間
- 位運算可以提高數據操作的效率
缺點:
- 包容性弱,成員之間會相互影響
簡單使用
需求: 需要記錄一個車子的行駛方向,
分析:
- 前后左右這四個方向如果分別使用bool值來存儲,那么需要4個字節,總共是32個位
- 這四個方向是互斥的,也就是一個時刻只能存儲一個方位,所以可以用聯合體來表示
- 每一個值放在一個位上面,所以是4位,也就是0.5個字節(當然最少也是1個字節),就比之前省了好多空間
定義屬性
屬性.png
定義聯合體
聯合體.png
解釋:
- union表示定義了一個聯合體
- char bits是我們真正使用的那一段內存的表示。就是成員
- 這里聯合體的內存是一個char表示的字節
- struct {}說明這個字節可以用來表示什么,每個類型用哪一位來表示
- front代表第一個位置,back代表第二個位置
- 后面的1表示占用1位
- 如果back寫的是2,則為0001 1111
- 這個是聯合體的名稱
聯合體的運算
先定義位運算的計算方式
計算方式.png
說明:
- 如果是向前,則將1左移0位,也就是0000 0001
- 如果是向后,則將1左移1位,也就是0000 0010
- 如果是向左,則將1左移2位,也就是0000 0100
- 如果是向右,則將1左移3位,也就是0000 1000
進行位運算設置(用向前來舉例)
運算.png
說明:
- |=,是取非運算符,都為0時為0,否則為1
- LGDirectionFrontMask為0000 0001,所以可以將bits的其他位數都設置為0,只保留最后一位為1
- 這樣就可以讓他代表向前
使用
使用.png
說明:
- 可以通過LLDB來查看此時的位數上為0或1