C++中類所佔內存,父類與子類所佔內存大小的關係(詳細記憶)

寫在前面的話(就先聽聽)

最近面試一直被面試官問道:

  • 一個類有什麼什麼變量,靜態變量等,請問這個類所佔內存多少字節呢?
  • 假如這個類含有若干個虛函數,然後還有子類又定義了一些的自定義成員和成員函數,還有虛函數之類的?那麼子類佔用多少字節呢?
  • 然後子類又繼承了一個孫子類,孫子類有添加了若干個成員,然後定義了什麼函數虛函數之類的,請問孫子類的內存大小又是多少呢?

然後就一直摸棱兩可的回答了一通,自己也沒有弄清楚,什麼大小啊,還有虛函數表怎麼繼承啊,怎麼修改啊,被懟的很厲害,於是下決心自己好好整理一下,希望對大家也有幫助。

正文

首先,我們在計算這個類所佔內存大小的時候,心裏應該有6個宗旨,總結就是:(後面會有解釋原因)

  1. 空類佔用1個字--------------------------------------------------------1字
  2. 靜態成員變量不佔內存大小----------------------------------------0
  3. 普通成員函數不佔內存大小----------------------------------------0
  4. 只要含有虛函數(繼承的或者是自定義)的佔內存---------1字
  5. 所有的非靜態成員變量---------------------------------------------本身類定義的成員變量總和+父類繼承下來的所有變量總和
  6. 注意字節對齊原則(整字數)

只要把這6個原則記住了,問題不大了。但是呢除了記住這幾個大的原則呢,還要知道爲什麼最好。下面就一一對5個原則進行補充。

 

詳細分析(配有參考鏈接):

  • 爲什麼空類佔用1個字:

答案就是因爲https://blog.csdn.net/zhaoxd200808501/article/details/72845691(看看別人大牛寫的)

簡單來說就是系統爲了標識一個類,不佔用內存在什麼地方記錄這個類的存在呢,那麼怎麼記錄呢,C/C++都是通過指針(一個字)來記錄,所以就不爲空。

  • 2-3這兩個記住就行了,靜態變量已經不屬於某個對象了,還有成員函數,可以將它們看作是“遊離”的內存塊即可。
  • 第四條應該注意的是:
    • 一個類中不管有多少個虛函數,虛函數表指針永遠只有一個(只佔一個字),這個指針是虛函數地址數組的首地址。數組元素是各個虛函數的地址,因此只需要知道這個首地址,那麼就可以找到所有的虛函數。
    • 子類繼承父類的時候:
      • 父類有虛函數,如果子類沒有虛函數,那麼計算子類內存大小的時候,子類繼承了父類虛函數,他就含有了虛函數,他就要加上那個虛函數表的一個字的內存大小;
      • 父類有虛函數,但是自己也定義的虛函數或者覆蓋了父類的虛函數,這樣子類也算是有了很多虛函數,虛函數表也是同樣佔用一個字的內存大小。
      • 父類沒有虛函數,子類含有虛函數:就在父類基礎上加上一個字虛函數表的大小
      • 父類和子類都沒有那就什麼都不用加了呀。
    • 孫子類和兒子類也是按照父類和子類的方法相同。
  • 第5條需要注意的一種情況是大家會有這樣的疑問:假如父類的非靜態成員變量是私有private的話,子類根本不繼承啊,那麼子類計算內存大小的時候還要加上這些父類私有變量嗎?

答案是“加上”。即使沒有權限不能使用這些變量,但是計算子類的內存大小的時候也要加上父類繼承下來的成員變量大小。不夠整個字數的湊夠整個字數就可以了。

總結起來就是:

子類內存大小=父類內存大小+子類自定義的成員變量大小

詳細的各種圖案可以查看https://blog.csdn.net/changyang208/article/details/78668462 這位大佬寫的很詳細很詳細。

希望不明白的或者寫的有誤的,大家可以留言多多指正和討論。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章