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

來源:互聯網
上載者:User

【lightnut】:
找本書看: Inside C++ Object Model (深入探索C++物件模型).

【liehen8475】:
普通成員函數不分配空間,可以把他當作是庫函數使用,因為它是靜態繫結的。
但是當類中定義了虛函數,要有4個位元組(多個虛函數也是4個位元組)的指標指向虛函數表。
剩下的成員定義順序分配並按#pragma pack(n)中的n對齊(windows預設為2)

http://community.csdn.net/Expert/topic/5573/5573227.xml?temp=.9110987

希望對你有些協助

【liehen8475】:
是這個

http://community.csdn.net/Expert/topic/5573/5573227.xml?temp=.499798

【Vitin】:
也可以看一下

http://community.csdn.net/Expert/TopicView.asp?id=5558320

【dcbenwu】:
[引用]

在在細緻的討論下類的儲存,在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.