回顧上一篇文章,對(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ì)齊原則