oc對(duì)象內(nèi)存對(duì)齊原則

回顧上一篇文章,對(duì)象是在alloc底層函數(shù)調(diào)用calloc(1,size)去分配的內(nèi)存,與calloc與之對(duì)應(yīng)的是malloc 那么我就在想calloc與malloc有啥區(qū)別呢?所以今天先來(lái)看看calloc與malloc的區(qū)別!

1.malloc與calloc的區(qū)別

1.calloc,函數(shù)原型calloc(size_t __count, size_t __size),在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配count個(gè)長(zhǎng)度為size的連續(xù)空間,函數(shù)返回一個(gè)指向分配起始地址的指針;(此存儲(chǔ)區(qū)中的初始值為0)如果分配不成功,返回NULL

2.malloc,函數(shù)原型malloc(size_t __size),在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。此函數(shù)的返回值是分配區(qū)域的起始地址(此存儲(chǔ)區(qū)中的初始值是不確定的),如果分配不成功,返回NULL

2.對(duì)影響對(duì)象內(nèi)存大小的因素探究

一個(gè)對(duì)象當(dāng)中只有成員變量、屬性、方法(對(duì)象與類(lèi)方法)、協(xié)議、分類(lèi)、擴(kuò)展6種因素有可能影響對(duì)象內(nèi)存大小,利用排除法來(lái)探究一下影響對(duì)象內(nèi)存大小得因素。
1.聲明一個(gè)沒(méi)有成員變量、屬性、方法的類(lèi),獲取內(nèi)存大小,personSize = 8


2.添加方法 readBook方法,從輸出結(jié)果可以看書(shū)方法對(duì)類(lèi)的內(nèi)存大小沒(méi)有影響personSize = 8


3.添加name屬性,內(nèi)存增加了8字節(jié), personSize = 16


4.驗(yàn)證成員變量會(huì)影響類(lèi)的內(nèi)存大小,添加一個(gè)_age成員變量,personSize = 24


5.添加一個(gè)協(xié)議讓類(lèi)遵循,personSize = 24,協(xié)議不影響對(duì)象內(nèi)存大小


6.創(chuàng)建一個(gè)ZFPerson分類(lèi),personSize = 24,類(lèi)的分類(lèi)也不影響對(duì)象內(nèi)存大小


7.添加一個(gè)擴(kuò)展并且添加一個(gè)weight屬性,personSize = 24,類(lèi)的擴(kuò)展也不影響對(duì)象內(nèi)存大小


結(jié)論:只有類(lèi)以及類(lèi)的父類(lèi)的成員變量會(huì)影響內(nèi)存的大小

3.對(duì)象內(nèi)存字節(jié)對(duì)齊原則

在上一篇文章查看alloc底層計(jì)算對(duì)象內(nèi)存大小,是instanceSize函數(shù)

    inline size_t instanceSize(size_t extraBytes) const {
        if (fastpath(cache.hasFastInstanceSize(extraBytes))) {
            return cache.fastInstanceSize(extraBytes);
        }

        size_t size = alignedInstanceSize() + extraBytes;
        // CF requires all objects be at least 16 bytes.
        if (size < 16) size = 16;
        return size;
    }
    uint32_t alignedInstanceSize() const {
        return word_align(unalignedInstanceSize());
    }
    static inline uint32_t word_align(uint32_t x) {
        return (x + WORD_MASK) & ~WORD_MASK;
    }

從代碼中可以看出,對(duì)象內(nèi)存字節(jié)對(duì)齊核心代碼是這 return x + WORD_MASK) & ~WORD_MASK一行代碼,WORD_MASK 在64位機(jī)器上為7UL。

#ifdef __LP64__ //64位機(jī)器
#   define WORD_SHIFT 3UL
#   define WORD_MASK 7UL
#   define WORD_BITS 64
#else
#   define WORD_SHIFT 2UL
#   define WORD_MASK 3UL
#   define WORD_BITS 32
#endif

(x + 7) & ~7 : 8字節(jié)對(duì)齊

結(jié)論:對(duì)象在64位機(jī)器上面是按照8字節(jié)對(duì)齊原則

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

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

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