C 類的儲存空間和空間大小的問題

2021-05-04 06:11:22 字數 2251 閱讀 2306

【lightnut】:

找本書看: inside c++ object model (深入探索c++物件模型).

【liehen8475】:

普通成員函式不分配空間,可以把他當作是庫函式使用,因為它是靜態繫結的。

但是當類中定義了虛函式,要有4個位元組(多個虛函式也是4個位元組)的指標指向虛函式表。

剩下的成員定義順序分配並按#pragma pack(n)中的n對齊(windows預設為2)

希望對你有些幫助

【liehen8475】:

是這個http://community.csdn.net/expert/topic/5573/5573227.xml?temp=.499798

【vitin】:

也可以看一下

[引用]

現 在在細緻的討論下類的儲存,在class中成員變數按照順序按照對齊要求在記憶體中排列,而普通成員函式在編譯時是靜態繫結,類呼叫時就象呼叫庫函式一樣, 所以類空間中沒有為普通成員函式分配空間,但是虛函式和純虛函式是動態繫結的,編譯時需要乙個指標指向乙個虛函式表,所以當類中有虛函式時,類的記憶體分配 為  成員變數+虛函式表指標(4個位元組,多個虛函式也只有乙個該指標)。

【dcbenwu】:

[引用]

只要有幾點需要考慮:

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++的人都應該讀它們。

【dai_weitao】:

有幾個要點,你記住就行了.

1` 非虛函式不佔類空間.

2` 虛函式佔4位元組空間, 因為virtual-table的原因.

3` 成員佔空間

4` 對齊原則

【millky】:

首 先解決第乙個問題,就是說空類的記憶體佔用量為1,這是因為c++要保證被乙個類的物件都有乙個特定的位址,因而賦予給他乙個位址作為標識;當有了成員變數 了就不需要了,因此不是1了,而是由位元組對齊所決定。int預設占用4個位元組的。當然,你舉的例子並不存在任何關於靜態繫結或者動態繫結的問題。 struct的也是一樣的。如果還是不明白,可以到我的blog去看看。

ps:謝謝裂痕同志,幫我解決了這個疑問!!

【monk0128】:

inside the c++ object model

這本書裡面介紹得很詳細了,我剛在看呢,在chapter3&4

C 類的儲存空間

1 空類的記憶體佔用量為1,這是因為c 要保證被乙個類的物件都有乙個特定的位址 因而賦予給他乙個位址作為標識 當有了成員變數了就不需要了。2 非虛函式不佔類空間.在編譯時是靜態繫結,類呼叫時就象呼叫庫函式一樣,所以類空 間中沒有為普通成員函式分配空間。3 虛函式佔4位元組空間,函式和純虛函式是動態繫...

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 如果某一成員變數長度大於處理器位數,則以處理器的位數為對...