一昧穿、結(jié)構(gòu)體
結(jié)構(gòu)體闹蒜,我們可以將它當做一種數(shù)據(jù)類型,并且是一個集合類的數(shù)據(jù)類型斑胜,它的數(shù)據(jù)成員可以是基礎(chǔ)數(shù)據(jù)類型(int鞠抑、double饭聚、float、bool等)搁拙,也可以是指針秒梳,甚至于是其他的結(jié)構(gòu)體。
下面是一個結(jié)構(gòu)體的定義示例:
struct XBPerson {
NSString *name;
int age;
} person;
二箕速、結(jié)構(gòu)體的size大小
既然結(jié)構(gòu)體作為一個集合類的數(shù)據(jù)類型端幼,可以存儲不同的數(shù)據(jù),那它的size大小是怎么計算的呢弧满?
1婆跑、一些數(shù)據(jù)類型占用的內(nèi)存大小
2、內(nèi)存對齊的原則
1.數(shù)據(jù)成員對齊規(guī)則:第一個數(shù)據(jù)成員的起始位置是0庭呜,之后數(shù)據(jù)成員的起始位置必須是成員自身大小的整數(shù)倍
2.結(jié)構(gòu)體作為成員:該結(jié)構(gòu)體成員的起始位置必須是其內(nèi)部最大成員大小的整數(shù)倍
3.收尾工作:結(jié)構(gòu)體的總大谢(sizeof),必須是其內(nèi)部最大成員大小的整數(shù)倍募谎,不足的需要補齊扶关。
三、分析
1数冬、一般結(jié)構(gòu)體分析
首先定義一個結(jié)構(gòu)體Struct1,如下:
struct Struct1 {
double a; //8字節(jié)
char b; //1字節(jié)
int c; //4字節(jié)
short d; //2字節(jié)
} struct1;
結(jié)合內(nèi)存對齊的原則节槐,我們對這個結(jié)構(gòu)體進行分析:
1、a拐纱,是double類型铜异,占用了8個字節(jié)的內(nèi)存,并且是第一個數(shù)據(jù)成員秸架,所以a的起始位置是0揍庄,范圍是[0,7]东抹。
2蚂子、b,是char類型缭黔,占用了1個字節(jié)的內(nèi)存食茎,所以b的起始位置是8(8是1的整數(shù)倍),范圍是[8]馏谨。
3别渔、c,是int類型,占用了4個字節(jié)的內(nèi)存钠糊,所以c的起始位置是12(9挟秤、10、11都不是4的整數(shù)倍抄伍,故從12開始)艘刚,范圍是[12,15]截珍。
4攀甚、d,是short類型岗喉,占用了2個字節(jié)的內(nèi)存秋度,所以d的起始位置是16,范圍是[16钱床,17]荚斯。
所以當前結(jié)構(gòu)體Struct1需要的大小是[0,17]查牌,也就是18字節(jié)事期。但是根據(jù)原則3,Struct1中最大成員是double(大小8字節(jié))纸颜,18不是8的整數(shù)倍兽泣,必須補齊,所以最終Struct1的大小是24胁孙。
這里我們代碼實際操作一下:如圖:
1、首先定義一個結(jié)構(gòu)體Struct2,如下:
struct Struct2 {
double a; //8字節(jié)
char b; //1字節(jié)
double c; //8字節(jié)
struct Struct1 struct1;
} struct2;
2涮较、a稠鼻、b、c分析同上法希,其中c的范圍是[12枷餐,19]靶瘸,至于數(shù)據(jù)成員結(jié)構(gòu)體struct1的起始位置苫亦,根據(jù)原則2(結(jié)構(gòu)體成員的起始位置必須是其內(nèi)部最大成員大小的整數(shù)倍,也就是double 8字節(jié)的整數(shù)倍)怨咪,20無法滿足條件屋剑,所以struct1的起始位置是24,范圍是[24诗眨,47]唉匾,所以struct2的范圍是[0,47],大小為48巍膘。
這里我們代碼實際操作一下:如圖: