看**:
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...