iOS內(nèi)存對齊分析

今天探索的是內(nèi)存是如何分配,如何對齊的, 一般我們在開發(fā)時通常都會用到LLDB斷點調(diào)試, 看看下圖對JJPerson的斷點打印


image.png

通過斷點打印這個person對象,以下是通過lldb指令打印輸出的值

x/6gx 0x600003f51590 (打印6個內(nèi)存段)

輸出

0x600003f51590: 0x00000001094407d0 0x0000001400006261
0x600003f515a0: 0x000000010943e038 0x000000010943e058
0x600003f515b0: 0x0000000000000000 0x0000000000000000

再繼續(xù)打印這些地址康康呢

po 0x600003f51590     --> <JJPerson: 0x600003f51590>
po 0x00000001094407d0   --> JJPerson 
po 0x000000010943e038   -->  daju
po 0x00000014           -->  20
po 0x62                 --> 98   (98是不是對應著ascll碼中的b)
po 0x61                 -->97  (97是不是對應著ascll碼中的a)

是不是有很多疑問?比如:
為啥還有0x0000000000000000呢?
c1 c2為啥共用的一段內(nèi)存呢, 但是可以分開打印?
age為什么要長一點?
為啥c1 c2在前面呢?

image.png

看看上面這個圖就知道了,因為不同類型所占字節(jié)大小不同, 蘋果系統(tǒng)為了方便讀取, 節(jié)約內(nèi)存所以對我們的對象的內(nèi)存進行了字節(jié)對齊,重排.

內(nèi)存對齊原則

1:數(shù)據(jù)成員對?規(guī)則:結構(struct)(或聯(lián)合(union))的數(shù)據(jù)成員库继,第
一個數(shù)據(jù)成員放在offset為0的地方阔挠,以后每個數(shù)據(jù)成員存儲的起始位置要
從該成員大小或者成員的子成員大小(只要該成員有子成員风响,比如說是數(shù)組,結構體等)的整數(shù)倍開始(比如int為4字節(jié),則要從4的整數(shù)倍地址開始存儲皿曲。 min(當前開始的位置mn)m=9n=4
9 10 11 12
2:結構體作為成員:如果一個結構里有某些結構體成員,則結構體成員要從其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲.(struct a里存有struct b,b
里有char,int ,double等元素,那b應該從8的整數(shù)倍開始存儲.)
3:收尾工作:結構體的總大小,也就是sizeof的結果,.必須是其內(nèi)部最大 成員的整數(shù)倍.不足的要補?。

如何理解上面的意思, 我們以這個結構體為例子

struct LGStruct1 {
    double a;    // 8字節(jié) (0-7) 
    char b;      // 1字節(jié) [8 ] (8)
    int c;       // 4字節(jié) [9 4] 9 10 11 (12 13 14 15)
    short d;     // 2字節(jié) [16 2] (16 17)
}struct1;

NSLog(@"struct1 - %lu",sizeof(struct1));

輸出

2020-09-09 00:42:58.246389+0800 001-內(nèi)存對齊原則[51039:4654930] struct1 - 24

內(nèi)存對齊規(guī)則1:開始位置必須是所占字節(jié)數(shù)的整數(shù)倍吴侦,才能開始存屋休。
(舉例:char b,由于開始位置是所占字節(jié)數(shù)的整數(shù)倍可以直接存,int c 备韧,開始位置是從9劫樟,并不是4的整數(shù)倍,所以從12開始存)

存儲大小是:18{0-17}

由于結構體中存在double為最大字節(jié)數(shù):8
(內(nèi)存對齊規(guī)則3:所占內(nèi)存必須是最大字節(jié)數(shù)的整數(shù)倍织堂。所以必須是8的整數(shù)倍叠艳。18-->24)

所以所占內(nèi)存大小是24.

struct JJStruct2 {
    int a;         //4字節(jié) (0-7)
    double b;      //8字節(jié) (8 9 10 11 12 13 14 15)
    char c;        //1字節(jié) (16)
    short d;       //2字節(jié)  (18 19)
}struct2;
// 20 -> 24
20不是8的整數(shù)倍,所以所占內(nèi)存是24


struct JJStruct3 {
    int a;                      //4字節(jié) (0 7)
    double b;                   //8字節(jié)    (8 9 10 11 12 13 14 15)
    char s;                     //1字節(jié)    (16)
    short cc;                   //2字節(jié)    (18 19)
    struct JJStruct2 *structoo; //8    (24 25 26 27 28 29 30 31)

} jjstruct3;
//32 -> 32
NSLog(@"%lu-%lu - %lu",sizeof(struct1),sizeof(struct2), sizeof(jjstruct3)); NSLog(@"%lu-%lu",sizeof(struct1),sizeof(struct2));

輸出

2020-09-09 00:25:39.871666+0800 001-內(nèi)存對齊原則[50912:4644070] 24-24 - 32
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捧挺,隨后出現(xiàn)的幾起案子虑绵,更是在濱河造成了極大的恐慌,老刑警劉巖闽烙,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅睛,死亡現(xiàn)場離奇詭異,居然都是意外死亡黑竞,警方通過查閱死者的電腦和手機捕发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來很魂,“玉大人扎酷,你說我怎么就攤上這事《舸遥” “怎么了法挨?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幅聘。 經(jīng)常有香客問我凡纳,道長,這世上最難降的妖魔是什么帝蒿? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任荐糜,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘暴氏。我一直安慰自己延塑,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布答渔。 她就那樣靜靜地躺著关带,像睡著了一般。 火紅的嫁衣襯著肌膚如雪研儒。 梳的紋絲不亂的頭發(fā)上豫缨,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音端朵,去河邊找鬼好芭。 笑死,一個胖子當著我的面吹牛冲呢,可吹牛的內(nèi)容都是我干的舍败。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼敬拓,長吁一口氣:“原來是場噩夢啊……” “哼邻薯!你這毒婦竟也來了?” 一聲冷哼從身側響起乘凸,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厕诡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后营勤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灵嫌,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年葛作,在試婚紗的時候發(fā)現(xiàn)自己被綠了寿羞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡赂蠢,死狀恐怖绪穆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虱岂,我是刑警寧澤玖院,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站第岖,受9級特大地震影響司恳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绍傲,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烫饼,春花似錦猎塞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至比藻,卻和暖如春铝量,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背银亲。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工慢叨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人务蝠。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓拍谐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馏段。 傳聞我的和親對象是個殘疾皇子轩拨,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355