愛伊米

iOS OC 物件的記憶體對齊原則

問題的引入

初始化一個  類,具有如下屬性:

初始化物件,並獲取物件的記憶體 :

列印結果:

由以上列印結果可以看出  和  獲取到的記憶體大小不一樣,那麼是什麼導致的兩者獲取同一物件的記憶體大小不一樣呢?我們下一步繼續探索。

首先我們先手動計算一下這個物件所佔的記憶體:

總計  位元組。

我們跟蹤  原始碼可以發現改變  的地方有兩個地方:

iOS OC 物件的記憶體對齊原則

繼續跟蹤

由以上原始碼可以得到  使用  位元組對齊原則處理 ,並且最小為  位元組。

calloc

由於  屬於  原始碼裡面

跟蹤 libmalloc 原始碼:

calloc 原始碼實現:

斷點列印

①:得到其真實呼叫為

②:搜尋  繼續跟進,列印  內部的  得到

③:分析  原始碼可以知道在  內進行了相關操作

跳轉到  內部發現程式碼很多,一臉懵逼,但是仔細一看很多都是做一些容錯判斷,除去這些程式碼後,返現與 有關的只有一行程式碼:

跳轉進  可以看到又是記憶體對齊的程式碼,這裡的記憶體對齊是以16位元組原則進行對齊的。

總結

經過上述的各種分析,我們可以得到的結論是  是以  位元組進行對齊的, 後面  是以  位元組進行對齊的,說明  進一步對物件進行了處理。也就解釋了我們打印出來的  了。

由以上可以知道物件申請的記憶體大小和系統開闢的大小存在不一致的情況, 位元組對齊應用於物件的屬性, 位元組對齊應用於物件,由於物件的記憶體是連續的,這樣可以規避一些不必要的風險,以空間換時間來得到更高的安全性。

-End-