類所佔的儲存空間的六點考慮

2021-09-30 08:48:44 字數 1042 閱讀 1373

類所佔的儲存空間需要對以下六點進行考慮:

1.非靜態成員變數的大小

2.有繼承關係的,其基類的大小

3.有虛函式的,一般有乙個虛函式表指標(注意,只是一般,雖然現在所有的編譯器都是這樣實現虛函式的,但它並不是c++標準的一部分)。

4.有虛繼承的,對每乙個虛繼承基類,一般有乙個虛基類索引(指標或偏移量,「一般」的理由同第二點)。這些索引可以直接放在物件的儲存空間內,如果是偏移量的話,也可以作為一項放在虛函式表中。(後面一種情況佔了大多數,因為它更節省空間)

5.如果物件本身需要空間為空,即不符合1-4任何一點的,也要為它分配1位元組,以避免不同物件指向同乙個位址。

6.按字長對齊,這是為了硬體效率而做的,也不是必須的(但是貌似所有的編譯器都做了這一點)

除了以上六點,各編譯器還可以在優化策略上做各種選擇,如基類子物件的位置,虛表指標的位置(開頭或結尾居多),虛基類子物件的位置,虛基類索引在類或虛表中的位置,而所有這些位置又都影響了最後一點:對虛表指標共用和不能共用的情況(共用的情況:如b繼承a,則a和b有可能可以共用乙個虛表指標,指向b的虛表,這需要a的虛表項在b的虛表中位置一致,此時雖然指向b的虛表,但在a看來,和a的虛表無區別。這還需要虛表指標的位置策略與基類子物件的位置策略不衝突(如基類子物件固定在開頭,虛表指標則固定在結尾,那麼除非無成員物件,否則不能共用)。在多繼承中,同一層次上最多只能和乙個基類共用,因為不同基類的空間不能重疊)。所有這些策略都由編譯器自行決定。結合開始六點空間需求的**,就形成了千變萬化的空間大小了。

為了不侷限編譯器開發者的創新能力,c++標準沒有對所有這些硬性規定,所以在編碼時盡量不要對物件的布局和大小做任何假設,這也是sizeof存在的原因之一。我們一般只要有乙個定性的認識——如虛函式往往意味著更大的空間,再如指向基類的指標和指向派生類的指標未必儲存了同乙個位址(特別是多繼承/虛繼承的時候)等等——就足以應付絕大多數的情況了。

另:inside   the   c++   object   model真的是一本很好的書,這裡所說的一切均出自它。此外還有design   and   evolution   of   c++也很有用。想學好c++的人都應該讀它們。

C 中類所佔的儲存空間

先看程式再分析 include using namespace std class a virtual void set int a virtual a class b struct c void main cout 分析如下 類所佔的空間 類成員變數所佔空間 4 如果存在虛函式的話 注意 1 類成...

C 中類所佔的儲存空間

分析如下 類所佔的空間 類成員變數所佔空間 4 如果存在虛函式的話 注意 1 類成員所佔的空間可能會涉及到記憶體資料對齊的問題,需要謹慎考慮 1 當成員變數的長度都小於處理器位數時,所有成員變數所佔的總空間一定是最長的變數所佔空間的整數倍 2 如果某一成員變數長度大於處理器位數,則以處理器的位數為對...

HashTable和HashMap的六點區別

hashtable和hashmap的六點區別 hashtable的應用非常廣泛,hashmap是新框架中用來代替hashtable的類,也就是說建議使用hashmap,不要使用hashtable。可能你覺得hashtable很好用,為什麼不用呢?這裡簡單分析他們的區別。1.hashtable的方法是...