回顧上一篇文章叽赊,對(duì)象是在alloc底層函數(shù)調(diào)用calloc(1,size)去分配的內(nèi)存英染,與calloc與之對(duì)應(yīng)的是malloc 那么我就在想calloc與malloc有啥區(qū)別呢门坷?所以今天先來看看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è)長度為size的連續(xù)空間棘幸,函數(shù)返回一個(gè)指向分配起始地址的指針盛杰;(此存儲(chǔ)區(qū)中的初始值為0
)如果分配不成功挽荡,返回NULL
2.malloc,函數(shù)原型malloc(size_t __size),在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長度為size的連續(xù)空間即供。此函數(shù)的返回值是分配區(qū)域的起始地址(此存儲(chǔ)區(qū)中的初始值是不確定的
)定拟,如果分配不成功,返回NULL
2.對(duì)影響對(duì)象內(nèi)存大小的因素探究
一個(gè)對(duì)象當(dāng)中只有成員變量逗嫡、屬性青自、方法(對(duì)象與類方法)、協(xié)議驱证、分類延窜、擴(kuò)展6種因素有可能影響對(duì)象內(nèi)存大小,利用排除法來探究一下影響對(duì)象內(nèi)存大小得因素抹锄。
1.聲明一個(gè)沒有成員變量逆瑞、屬性、方法的類伙单,獲取內(nèi)存大小呆万,personSize = 8
2.添加方法 readBook方法,從輸出結(jié)果可以看書方法對(duì)類的內(nèi)存大小沒有影響personSize = 8
3.添加name屬性车份,內(nèi)存增加了8字節(jié), personSize = 16
4.驗(yàn)證成員變量會(huì)影響類的內(nèi)存大小牡彻,添加一個(gè)_age成員變量扫沼,personSize = 24
5.添加一個(gè)協(xié)議讓類遵循出爹,personSize = 24,協(xié)議不影響對(duì)象內(nèi)存大小
6.創(chuàng)建一個(gè)ZFPerson分類缎除,personSize = 24严就,類的分類也不影響對(duì)象內(nèi)存大小
7.添加一個(gè)擴(kuò)展并且添加一個(gè)weight屬性,personSize = 24器罐,類的擴(kuò)展也不影響對(duì)象內(nèi)存大小
結(jié)論:只有類以及類的父類的成員變量會(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ì)齊原則