C 類和物件(二) 記憶體對齊

2021-09-27 11:51:11 字數 1733 閱讀 2084

物件的引入(類的例項化)

在c++物件導向這門語言中,不僅需要類這種將所有相同事物合併在一起的結構,還需要針對於這個空殼(類)進行建立物件(例項化物件),建立出乙個乙個的具有這種類屬性和方法的單位,就叫做物件。

class

people

;int

main()

物件的作用

當使用者建立出眾多的物件之後,肯定是需要這一批物件來幫助自己完成一系列的任務,所以,就有了許多的相同型別的物件,比如說建立的people類,中可以有姓名為張三/李四等等相同屬性和相同方法的物件。

如何計算類的大小

一道經典的類物件大小計算問題

classt1;

classt2;

intmain()

//answer:t1 size is : 16

// t2 size is : 24

我們可以發現,類物件進行大小計算時,在類中定義相同的變數不同的順序最終計算出來的類物件的大小竟然不一樣,在此,我們展開對此進行研究。

首先我們來討論一下記憶體對齊(暫時不考慮虛函式例子(後面的部落格會針對於虛函式再做記憶體對齊講解))

1.概念

在類物件中成員變數在記憶體中的布局形式,如上述類成員布局格式如下圖所示

t1類物件模型

其中:截圖中是以16進製制進行編碼,所以

_c占用四個位元組為63,_b占用四個位元組為1,_a占用八個位元組為0.1 ,總占用位元組數為16

t2類物件模型

其中:_c占用八個位元組為63,_b占用八個位元組為1,_a占用八個位元組為0.1 ,總占用位元組數為24

類物件模型對齊規則

類中的每個元素都是從上至下(按照順序)放入記憶體的。

每個元素放入記憶體時,都會以自身型別大小為單位來劃分儲存單元,所以每乙個元素放置的位置一定是從首位址的整數倍的位置開始儲存。(char,double,int中,char存放乙個位元組,但是double存放以自身為中心,所以他需要讓char的記憶體對齊,偏移量為7個位元組,double從第9個位元組開始儲存,int存放為從第17個位元組開始,存放四個位元組)

在放置完成後,會進行檢查總容量是否為最長元素的整數倍,如果不是,則會進行記憶體補齊,所以最終大小一定為最長元素的整數倍(接2中的例子,int存放到20即可,但是需要進行記憶體補齊,所以,在int後又加了4個位元組進行補齊)

左圖為 char int double

右圖為char、double、int

虛函式、普通函式在編譯完成後,會將這些函式放入【**區】,當呼叫函式名時,普通成員函式的函式名也是乙個指標會指向**段的該函式,共cpu進行處理,虛函式則通過虛表指標進行訪問(在此筆者不做細講)

//根據上面people類進行呼叫格式講解

intmain()

呼叫規則一般是通過物件名稱+. 的形式來呼叫,當然也可以使用指標指向來進行呼叫。

C 類 記憶體對齊和類大小理解

首先,預設的塊對齊長度是4位元組,此外也可以通過 pragma pack x 修改,同時,自己修改完之後記得使用 pragma pack 恢復預設值。此外,又分了幾種情況 1 如果有虛函式,則會儲存虛函式表的位址 僅乙個位址,4位元組或8位元組 該位址是存放在類記憶體的最開始的地方。2 如果出現比x...

C 類的記憶體對齊

記憶體對齊。對下面的類 class b 大家可以猜一下類 b物件的大小。如果你猜是18 4 2 8 4 也不能說你錯。但是你用 sizeof b 一看,結果竟然是 24!多出來的 6個位元組是怎麼回事呢?其實是記憶體對齊搞的鬼。在編譯器的結構成員對齊設定為預設的情況下,分配給各個成員變數的記憶體大小...

C 類中的記憶體對齊

在沒有 pragma pack巨集的情況下 1.資料成員對齊規則 struct,union的資料成員,第乙個資料成員放在offset為0的地方,之後的資料成員的儲存起始位置都是放在該資料成員大小的整數倍位置。如在32bit的機器上,int的大小為4,因此int儲存的位置都是4的整數倍的位置開始儲存。...