1樓:匿名使用者
這是因為虛繼承會生成一個虛基表(vbtable)指標vbptr,其中指標vbptr指向虛基表vbtable。
虛基表記錄了類相對於指標vbptr在物件中的偏移量。
虛繼承時,虛基類指標vbptr指向虛基類表vbtable,虛基類表中存放的就是資料相對於虛基類指標的偏移,從而根據偏移找到資料。
在vbtable中:
0:當前最近作用域的偏移(vbptr的偏移)
1:虛繼類資料的起始偏移(vbptr的偏移)
在vs中檢視類的記憶體佈局:
方法1:在vs中,專案->屬性->c/c++->命令列中新增/d1reportallclasslayout即可檢視這兩個類的記憶體分佈情況。
方法2:在vs中,工具->visual studio 命令提示,然後用cd命令切換到cpp檔案的目錄,按照你的cpp檔案為【源.cpp】,具體方法如下:
cl 源.cpp /d1reportallclasslayout
然後就可以看到類的記憶體分佈了,附上我的測試圖(一樣的**):
類father和類son1的記憶體分佈
也可以在vs的監視視窗看看程式執行時的記憶體情況。
2樓:匿名使用者
難道是因為多了一個虛繼承表指標?
c++中虛繼承和一般的繼承有什麼不同
3樓:隨意之歌
虛繼承不管父類派生出多少個子類在記憶體總只存在一套資料,但是一般繼承會存在與派生類個數對應的n個資料(n為派生類個數)
c++帶虛擬函式的虛繼承
4樓:du知道君
1、對比兩個所謂的空類:
class m
};class n
};在常用的編譯器下,sizeof(m)是1,sizeof(n)是4。這是由於m中無資料成員,但是為了確保記憶體空間的唯一性,編譯器會給m中新增一個隱含的char型別;n是4這個解釋起來比較複雜,簡單說是為了實現虛擬函式,編譯器會在含有虛擬函式的類裡新增一個一般稱為vptr指標,這個指標指向虛擬函式表。
2、b和c沒有新增任何資料成員,僅僅override函式,所有大小不變。
3、虛擬繼承理解起來要複雜的多,這個例子也沒有涉及到。
為什麼系統安裝記憶體越大系統佔用的記憶體也越大
記憶體越大,作業系統就會把更多的東西放到記憶體裡,使得作業系統的速度更快。這種情況一般是有上限的,當記憶體足夠大的時候,作業系統也不會無限制的使用更多的記憶體。比如fat驅動裡會根據記憶體大小調整快取個數和延遲關閉檔案控制代碼的數量 這只是一方面因素。另外一個因素是作業系統管理一塊記憶體,也需要消耗...
手機裡最佔記憶體的是什麼,為什麼手機記憶體佔用很多?
手機記憶體分儲存記憶體和執行記憶體。儲存記憶體跟你 的檔案多少,執行軟體快取檔案的大小有關係,例如你 一個pps,如果沒有設定自動清除快取檔案,看了一集電視劇的快取檔案就會留在儲存記憶體裡面,你用微信,qq進行的語音資訊,還有大量的 都會暫用儲存記憶體,很多時候就算你把軟體解除安裝了,這些快取檔案還...
記憶體使用率挺高的 為什麼記憶體佔用率這麼高?
剛開機就這麼多程序,用360清理一下啟動項和服務項,把那些不需要開機啟動的禁掉。把開機啟動項能禁止的禁止 能延遲的延遲,金山沒有系統優化嗎?我用的360有一鍵優化 不行換360吧。為什麼記憶體佔用率這麼高?8g本來就小,當然是對win10來說的,且你給的圖豪無用處,沒顯示出佔大量記憶體的程序,但防護...