iOS 結(jié)構(gòu)體內(nèi)存對齊分析

一昧穿、結(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)存大小

一些數(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胁孙。

這里我們代碼實際操作一下:如圖:

一般結(jié)構(gòu)體size
2唠倦、結(jié)構(gòu)體嵌套結(jié)構(gòu)體分析
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巍膘。

這里我們代碼實際操作一下:如圖:
結(jié)構(gòu)體嵌套結(jié)構(gòu)體size
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厂财,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子峡懈,更是在濱河造成了極大的恐慌璃饱,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肪康,死亡現(xiàn)場離奇詭異荚恶,居然都是意外死亡,警方通過查閱死者的電腦和手機磷支,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門谒撼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雾狈,你說我怎么就攤上這事廓潜。” “怎么了善榛?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵茉帅,是天一觀的道長。 經(jīng)常有香客問我锭弊,道長堪澎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任味滞,我火速辦了婚禮樱蛤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剑鞍。我一直安慰自己昨凡,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布蚁署。 她就那樣靜靜地躺著便脊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪光戈。 梳的紋絲不亂的頭發(fā)上哪痰,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音久妆,去河邊找鬼晌杰。 笑死,一個胖子當著我的面吹牛筷弦,可吹牛的內(nèi)容都是我干的肋演。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爹殊!你這毒婦竟也來了蜕乡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤梗夸,失蹤者是張志新(化名)和其女友劉穎异希,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绒瘦,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡称簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惰帽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憨降。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖该酗,靈堂內(nèi)的尸體忽然破棺而出授药,到底是詐尸還是另有隱情,我是刑警寧澤呜魄,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布悔叽,位于F島的核電站,受9級特大地震影響爵嗅,放射性物質(zhì)發(fā)生泄漏娇澎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一睹晒、第九天 我趴在偏房一處隱蔽的房頂上張望趟庄。 院中可真熱鬧,春花似錦伪很、人聲如沸戚啥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猫十。三九已至,卻和暖如春呆盖,著一層夾襖步出監(jiān)牢的瞬間拖云,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工絮短, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留江兢,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓丁频,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子席里,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344