聯(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é)果都被丟棄了。