類的記憶體布局小議

2021-09-30 07:22:12 字數 1045 閱讀 6350

看**:

class a

};class b : virtual publica};

class c : virtual public a

};class d : public b, public c};

int main()

輸出結果是

8 16 16 28

,看看究竟是怎麼來的

首先,類

a裡面有乙個虛函式

hello

,那麼這個類就多了乙個隱藏的資料

----

指向虛函式表(

vtbls

)的指標(

vptrs

),我們假設是在

32位系統下,所以

a的大小為:

4+4 = 8

;對於類

b,虛繼承於

a,那麼除了類

b的成員

a和乙個

vptrs

外,還有

a的成員

a以及vtpr

,所以b

的大小:

4+4+4+4=16;c

與b分析相同。那麼d

呢?首先它有自己的成員

a以及乙個

vptrs

,再有b、c

的成員a

和vptrs

,同時也存在

a的成員a和

a的vptrs

,由於虛繼承的關係

d中只保留了a乙份副本,這裡需要提一下的是,d的

vprts是和b

或者c的vptrs

可以共用,編譯器優化,所以

d本身的大小是4位元組

(成員a)所以

d的大小為

4+4+4 +4+4

+4+4= 28 byte d

本身bca可以參照下圖物件

d的記憶體分配布局:

具體的編譯器優化可能有所不同。

另參考《

more effective c++

》第24

條款和《深入淺出mfc》第一篇第二章之類與物件大解剖。

c 類的記憶體布局

本文基本上是對於stanley b.lippman的inside the c object model一書第一章第三章的概括,描述了c 類的記憶體布局情況.c 的類的記憶體布局有如下規則 1.nonstatic data member 存放在class object中 2.static data m...

c 類的記憶體布局

c 中的struct需要記憶體對齊,便於機器訪問該struct。每個物件 如果類含有虛函式 在首位址位置放置了vptr,指向自己的虛函式表。物件中不包含成員函式 靜態的或非靜態的 它們可以被物件共享,靜態成員函式沒有this指標,所以不能被物件呼叫,non static 成員函式隱含有乙個this指...

小議LWIP 記憶體對齊

每一種處理器都會有自己的記憶體對齊要求,這樣做的目的很大程度上是為了處理器讀取記憶體資料的效率,當然還有匯流排等因素的影響,具體的可以看一下為什麼要記憶體對齊 data alignment straighten up and fly right 我覺得寫得還不錯。好了,廢話不多說,接下來看一下lwi...