【待更新】C++中sizeof的理解

重新回顧C++基礎知識,發(fā)現(xiàn)很多有趣的事情。

1、普通數(shù)據(jù)類型的sizeof

普通數(shù)據(jù)類型,比如說char、short、int、long、ptr等等,和系統(tǒng)位數(shù)(32位或者64位)有關。

2、數(shù)組的sizeof


3、結構體的sizeof


4、類的sizeof

4.1 空類

僅有類的聲明,沒有任何成員函數(shù),也沒有任何成員數(shù)據(jù)。這種類的sizeof固定為1。

以上代碼運行后輸出結果為:A=1, a=1

空類也是類,也可以進行實例化,在編譯空類的時候編譯器會隱含添加1個字節(jié),以便實例化的時候不同的對象擁有不同的地址(To ensure that the addresses of two different objects will be different.),所以空類的sizeof為1。

返回的結果為:A=1, a=1

類的大小與它的構造函數(shù)、析構函數(shù)(虛析構函數(shù)除外)和其他普通函數(shù)成員(虛函數(shù)除外)無關,只已它的數(shù)據(jù)成員有關。

4.2 普通類

普通的類中,包含普通的函數(shù)或者數(shù)據(jù)成員。

4.2.1 普通函數(shù)成員和普通數(shù)據(jù)成員

返回的結果為:A=8, a=8, size=8

4.2.2 多個不同數(shù)據(jù)類型的數(shù)據(jù)成員,如下定義:

返回的結果為:A=16, a=16, size=16

返回的結果為:A=32, a=32, size=22

我們將數(shù)據(jù)成員變量p和z的聲明的位置互換,看下面這個例子:

返回的結果為:A=24, a=24, size=22

為什么sizeof的結果不一樣呢?原因是這里面存在字節(jié)對齊問題。

4.2.3 有靜態(tài)數(shù)據(jù)成員

返回結果為:A=8, a=8, size=8

靜態(tài)數(shù)據(jù)成員被編譯器放在程序的一個global data members中,它是類的一個數(shù)據(jù)成員。但是它不影響類的大小,不管這個類實際產(chǎn)生了多少實例,還是派生了多少新的類,靜態(tài)數(shù)據(jù)成員在類中永遠只有一個實體存在。而類的非靜態(tài)數(shù)據(jù)成員只有被實例化的時候,他們才會被創(chuàng)建。但是類的靜態(tài)數(shù)據(jù)成員一旦被聲明,無論類是否被實例化,它都已被創(chuàng)建??梢赃@么說,類的靜態(tài)數(shù)據(jù)成員是一種特殊的全局變量。

4.2.4 有虛函數(shù)

包含虛函數(shù)的類

返回的結果為:A=8, a=8

當類中有虛函數(shù)(包括虛析構函數(shù))的時候,會有一個指向虛函數(shù)表的指針(vptr),在32位系統(tǒng)分配指針大小為4字節(jié),64位系統(tǒng)分配指針大小為8字節(jié)。

4.3 有繼承

4.3.1 簡單繼承關系

4.3.2 有虛函數(shù)繼承關系

4.3.3 虛繼承關系

當存在虛擬繼承時,派生類中會有一個指向虛基類表的指針。所以其大小應為普通繼承的大小,再加上虛基類表的指針大小。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,671評論 1 51
  • 1. 結構體和共同體的區(qū)別。 定義: 結構體struct:把不同類型的數(shù)據(jù)組合成一個整體,自定義類型。共同體uni...
    breakfy閱讀 2,270評論 0 22
  • 1.在C++ 程序中調用被C 編譯器編譯后的函數(shù),為什么要加extern “C”? 答:首先,extern是C/C...
    曾令偉閱讀 955評論 0 4
  • 一個博客,這個博客記錄了他讀這本書的筆記,總結得不錯?!渡疃忍剿鰿++對象模型》筆記匯總 1. C++對象模型與內...
    Mr希靈閱讀 5,900評論 0 13
  • C++ 語言基礎 1. 局部變量和全局變量能否重名? 局部變量是定義在函數(shù)內部的變量。全局變量是定義在函數(shù)之外的變...
    MinoyJet閱讀 813評論 0 2

友情鏈接更多精彩內容