iOS 內(nèi)存字節(jié)對齊計(jì)算方式

字節(jié)對齊有三原則:

1:數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員存儲的起始位置要從該成員大小或者成員的子成員大?。ㄖ灰摮蓡T有子成員,比如說是數(shù)組,結(jié)構(gòu)體等)的整數(shù)倍開始(比如int在32位機(jī)為4字節(jié),則要從4的整數(shù)倍地址開始存儲。

2:結(jié)構(gòu)體作為成員:如果一個結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲.(struct a里存有struct b,b里有char,int ,double等元素,那b應(yīng)該從8的整數(shù)倍開始存儲.)

3:收尾工作:結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,.必須是其內(nèi)部最大成員的整數(shù)倍.不足的要補(bǔ)齊.

例子

struct StructOne {
    char a;         //1字節(jié) 規(guī)則1[0]
    double b;       //8字節(jié) 規(guī)則2[8-15]
    int c;          //4字節(jié) 規(guī)則2[16-19]
    short d;        //2字節(jié) 規(guī)則2[20-22]  規(guī)則3補(bǔ)齊[23]
} MyStruct1;

struct StructTwo {
    double b;       //8字節(jié) 規(guī)則1[0-7]
    char a;         //1字節(jié) 規(guī)則1[8]
    int c;          //4字節(jié) 規(guī)則1[12-15]
    short d;        //2字節(jié) 規(guī)則1[16-17]    規(guī)則3補(bǔ)齊[18-23]
} MyStruct2;

struct StructThree {
    double b;       //8字節(jié) 規(guī)則1[0-7]
    char a;         //1字節(jié) 規(guī)則1[8] 
    short d;        //2字節(jié) 規(guī)則1[10-11]
    int c;          //4字節(jié) 規(guī)則1[12-15]
} MyStruct3;

struct StructFour {
    double b;        //8字節(jié) 規(guī)則1[0-7]
    char a;          //1字節(jié) 規(guī)則1[8]
    short d;         //2字節(jié) 規(guī)則1[10-11]
    struct StructThree c;//16字節(jié) 規(guī)則2[16-31]
} MyStruct4;

NSLog(@"%lu---%lu--%lu--%lu", sizeof(MyStruct1), sizeof(MyStruct2), sizeof(MyStruct3), sizeof(MyStruct4));

打印結(jié)果: 24---24--16--32

參考資料
快速弄懂內(nèi)存字節(jié)對齊
iOS 內(nèi)存字節(jié)對齊

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • @[c++|struct] 今天在編程中碰到一個坑,搞的調(diào)試了半天,最后發(fā)現(xiàn)程序中在寫數(shù)據(jù)和讀取數(shù)據(jù)時結(jié)構(gòu)體定義不...
    drybeans閱讀 3,858評論 1 11
  • 源網(wǎng)址[英文] github上有大神翻譯了一篇內(nèi)存對齊的英文文獻(xiàn),我復(fù)現(xiàn)了一下過程; 發(fā)現(xiàn)其中有個地方有出入(st...
    十曰立閱讀 1,224評論 0 3
  • 通過一段代碼來描述內(nèi)存對齊的現(xiàn)象。 上述代碼打印出來的結(jié)果為:24,16 為什么相同的結(jié)構(gòu)體,只是交換了變量 ab...
    豆瓣菜閱讀 7,025評論 5 26
  • 為什么字節(jié)對齊: 體系結(jié)構(gòu)的對齊和不對齊,是在時間和空間上的一個權(quán)衡。對齊節(jié)省了時間。假設(shè)一個體系結(jié)構(gòu)的字長為w,...
    和女神經(jīng)常玩閱讀 387評論 0 0
  • unsafe 包簡單說明 unsafe,顧名思義,是不安全的,Go定義這個包名也是這個意思,讓我們盡可能的不要使用...
    Gopherzhang閱讀 1,628評論 8 3

友情鏈接更多精彩內(nèi)容