記憶體對齊的原則:
資料成員對⻬規則:結構(struct)(或聯合(union))的資料成員,第
乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要
從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是陣列,
結構體等)的整數倍開始(比如int為4位元組,則要從4的整數倍位址開始存
儲。結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從
其內部最大元素大小的整數倍位址開始儲存.(struct a裡存有struct b,b
裡有char,int ,double等元素,那b應該從8的整數倍開始儲存.)
收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補⻬。
舉個例子:
struct struct1 struct1;
struct struct2 struct2;
nslog
(@"struct1占用記憶體大小:%lu"
,sizeof
(struct1));
nslog
(@"struct2占用記憶體大小:%lu"
,sizeof
(struct2)
);
輸出結果:
struct1占用記憶體大小:24
struct2占用記憶體大小:16
同樣的變數,只是順序不同,占用的記憶體不一樣,這和記憶體對齊有關
先分析struct1
同理分析struct2
擴充套件
struct struct3 struct3;
struct struct4 struct4;
nslog
(@"struct4占用記憶體大小:%lu"
,sizeof
(struct4)
);
輸出
struct4占用記憶體大小:40
分析:struct3最大長度是4,struct3整體是4位元組對齊
struct1最大長度是8,struct1整體是8位元組對齊
struct1是8位元組對齊的,12不是8的整數倍,因此struct1從16號位開始
這裡介紹獲取記憶體的三種方式:
sizeof
sizeof是乙個操作符,不是函式
我們一般用sizeof計算記憶體大小時,傳入的主要物件是資料型別,這個在編譯器的編譯階段(即編譯時)就會確定大小而不是在執行時確定。
sizeof最終得到的結果是該資料型別占用空間的大小
class_getinstancesize
malloc_size
記憶體對齊 記憶體對齊規則解釋 記憶體對齊原理
一 記憶體對齊的原因 我們都知道計算機是以位元組 byte 為單位劃分的,理論上來說cpu是可以訪問任一編號的位元組資料的,我們又知道cpu的定址其實是通過位址匯流排來訪問記憶體的,cpu又分為32位和64位,在32位的cpu一次可以處理4個位元組 byte 的資料,那麼cpu實際定址的步長就是4個...
記憶體對齊原理
相信絕大多數的人都了解記憶體對齊,對齊後效能高。但是其最最底層的原理是啥呢?有的人可能會說,因為快取記憶體的工作機制。讀者你很聰明,這是原因之一。但我今天想挖的是更底層一點的原理,讓我們去記憶體的物理構成裡找找答案!乙個記憶體是由若干個黑色的記憶體顆粒構成的。每乙個記憶體顆粒叫做乙個chip。每個c...
C 中記憶體對齊原理及作用
struct class union記憶體對齊原則有四個 1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小 只要該成員有子成員,比如說是陣列,結構體等 的整數倍開始 比...