聯(lián)合體位域

OC底層原理探索文檔匯總

聯(lián)合體union的每一位表示一個信息叫做聯(lián)合體位域

聯(lián)合體

聯(lián)合體也叫共用體,由不同的數(shù)據(jù)類型組成,其變量互斥,存儲方式是所有成員共用一個段內(nèi)存,共同體同一時刻只能保存一個成員的值,如果對新的成員賦值,就會將原來成員的值覆蓋掉。

結(jié)構(gòu)體
結(jié)構(gòu)體是把不同的數(shù)據(jù)組合存儲成一個整體,存儲方式是所有成員組合存儲,每個成員都分別占用一個內(nèi)存。

聯(lián)合體與結(jié)構(gòu)體的區(qū)別

  • 內(nèi)存占用情況
    • 結(jié)構(gòu)體的各個成員會占用不同的內(nèi)存,互相之間沒有影響
    • 共用體的所有成員占用同一段內(nèi)存,修改一個成員會影響其余所有成員
  • 內(nèi)存分配大小
    • 結(jié)構(gòu)體內(nèi)存 >= 所有成員占用的內(nèi)存總和(成員之間可能會有縫隙)
    • 共用體占用的內(nèi)存等于最大的成員占用的內(nèi)存

優(yōu)缺點:
優(yōu)點:

  • 節(jié)省空間
  • 位運算可以提高數(shù)據(jù)操作的效率

缺點:

  • 包容性弱,成員之間會相互影響

簡單使用

需求: 需要記錄一個車子的行駛方向,

分析:

  • 前后左右這四個方向如果分別使用bool值來存儲,那么需要4個字節(jié),總共是32個位
  • 這四個方向是互斥的,也就是一個時刻只能存儲一個方位,所以可以用聯(lián)合體來表示
  • 每一個值放在一個位上面,所以是4位,也就是0.5個字節(jié)(當(dāng)然最少也是1個字節(jié)),就比之前省了好多空間

定義屬性

屬性.png

定義聯(lián)合體

聯(lián)合體.png

解釋:

  1. union表示定義了一個聯(lián)合體
  2. char bits是我們真正使用的那一段內(nèi)存的表示。就是成員
    • 這里聯(lián)合體的內(nèi)存是一個char表示的字節(jié)
  3. struct {}說明這個字節(jié)可以用來表示什么,每個類型用哪一位來表示
    • front代表第一個位置,back代表第二個位置
    • 后面的1表示占用1位
    • 如果back寫的是2,則為0001 1111
  4. 這個是聯(lián)合體的名稱

聯(lián)合體的運算

先定義位運算的計算方式

計算方式.png

說明:

  • 如果是向前,則將1左移0位,也就是0000 0001
  • 如果是向后,則將1左移1位,也就是0000 0010
  • 如果是向左,則將1左移2位,也就是0000 0100
  • 如果是向右,則將1左移3位,也就是0000 1000

進(jìn)行位運算設(shè)置(用向前來舉例)

運算.png

說明:

  • |=,是取非運算符,都為0時為0,否則為1
  • LGDirectionFrontMask為0000 0001,所以可以將bits的其他位數(shù)都設(shè)置為0,只保留最后一位為1
  • 這樣就可以讓他代表向前

使用

使用.png

說明:

  • 可以通過LLDB來查看此時的位數(shù)上為0或1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容