有以下幾點需要考慮:
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真的是一本很好的書,這裡所說的一切均出自它。此外還有the design and evolution of c++也很有用。想學好c++的人都應該讀它們。
開源portal網上資料了解
開源portal網上資料了解 lightportal 啟用記憶體資料庫,原始碼可以匯入eclipse。但是問題是發布portlet要比較複雜的配置,本身沒有豐富的portlet支援。jqueryportal jquery頁面效果的擴充套件。真的只有客戶端的 通過js來layout頁面的html布局。...
開源專案選擇
google code的優勢 google code的劣勢 sourceforge的優勢 sourceforge的劣勢 下面我們展開來對比一下兩者的功能 bug報告。google code中的issues,sourceforge的tracker。google code的issues定製性非常好,並可...
如何選擇開源許可協議
原文出處 目前國內開源專案正在逐漸公升溫,中國也開始有不少優秀的開源專案突顯出來。在大家摩拳擦掌準備加入開源大軍時,也要知道這個圈子裡的規則。技術人員不能只是研究技術,任何圈子都有規則,要知道了才能玩得好。前段時間有件關於開源軟體的事情挺熱鬧的,關於國內乙個開發者把自己作品開源出來被別的公司的人拿去...