聯(lián)合體和位域

聯(lián)合體和位域

在上一篇iOS中關(guān)于內(nèi)存對齊的探究中,我們探索了結(jié)構(gòu)體內(nèi)存對齊的情況,這部分繼續(xù)探索一下位域和聯(lián)合體union

位域

我們先來看位域,在結(jié)構(gòu)體中

struct Car1 {

  BOOL front;  //1

  BOOL back ;  //1

  BOOL left ;  //1

  BOOL right;  //1       //4字節(jié)

}car1;

這樣一個結(jié)構(gòu)體所占空間是4字節(jié)。我們在想一個布爾值在二進制中,用0或1一位就能表示,那這樣將大大節(jié)約了內(nèi)存空間。由此我們引出了位域

struct Car1 {

  BOOL front: 1;

  BOOL back : 1;

  BOOL left : 1;

  BOOL right: 1;         //不超過8位,只占用1個字節(jié)。

}car1;

這樣的結(jié)構(gòu)體,所占內(nèi)存空間只有1個字節(jié)了。當然我們也可以在后面自定義所占空間,也可以占用更多的空間。

聯(lián)合體

我們先定義如下聯(lián)合體

union un2{

  double a;   //8

  int    b;   //4

  char   c;   //1

  char   d;   //1

};

我們先打印一下sizeof()

2021-06-11 09:45:53.206451+0800 KCObjcBuild[87220:3314559] sizeof = 8

我們把聯(lián)合體的內(nèi)容再改變一下,這次去掉8字節(jié)的double類型

union un2{

  int  b;   //4

  char  c;   //1

  char  d;   //2

};

再來打印一下sizeof()

2021-06-11 09:48:49.336502+0800 KCObjcBuild[87246:3316473]sizeof = 4

說明他里面只保留一個最大成員的內(nèi)存地址,來存儲數(shù)據(jù)。并沒有開辟多個內(nèi)存地址,來存儲所有的數(shù)據(jù)。我們可以給聯(lián)合體賦值,看看會打印什么

    union un2 persion ;

    persion.c = 'o';

    persion.b = 4;

    persion.a = 10.00;

打印結(jié)果如下:

(un2) persion = (a = 10, b = 0, c = '\0', d = '\0')

測試結(jié)果表明,他只存儲了我們最后賦值的值,和我們打印他的內(nèi)存大小結(jié)果相印證。其他的賦值結(jié)果都被丟棄了。

?著作權(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)容