為什麼這個程式中sizeof的結果是4

2021-06-17 20:51:52 字數 1018 閱讀 2392

為什麼這個程式中sizeof的結果是4?

#include

#include

using namespace std;

class base

}sizeof(a)=4 ? 你問的實際就是這個問題.

不知道你了不了解c++多型的實現方式?看沒有看過一本書<>裡面講的很清楚.

當乙個類中有虛函式存在時,編譯器為自動為我個類加上乙個成員(對於程式設計師來說,是透明的)vptr,也就是虛表指標.它指向乙個虛表,表中存放的時類的虛函式位址,用於實現c++的動態繫結.

c++多型中的vptr

以下文字摘錄自為了完成這件事,編譯器對每個包含虛函式的類建立乙個表 (稱為vtable)。在vtable中,編譯器旋轉特定類的虛函式位址。在每個帶有虛函式的類中,編譯器「秘密」地置一指標,稱為vpointer (縮寫為vptr),指向這個物件的vtable。通過基類指標(或者引用)做虛函式呼叫時,也就是做多型呼叫時,編譯器靜態地插入取得這個vptr,並在vtable表中查詢函式位址的**,這樣就能呼叫正確的函式使動態繫結發生。

為了看到vptr,特編寫如下函式:

class no_virtual

int i() const

};class one_virtual

int i() const

};class two_virtuals

virtual int i() const

};void main()

{cout<<"int:"<

<

<

<

不帶虛函式,物件的長度恰好就是所期望的:單個int的長度。而帶有單個虛函式的one_virtual,物件的長度是no_virtual的長度加上乙個void指標的長度。它反映出,如果有乙個或多個虛函式,編譯器將在這個結構中插入乙個指標(vptr)。在one_virtual和two_virtuals之間沒有區別。這是因為vptr指向乙個存放位址的表,只需要乙個指標,因為所有虛函式位址都包含在這個表中。

我為什麼要寫這個部落格?

自己工作也有幾年了,從事的內容可以用以下幾個關鍵字概括 1 c 2 vr 3 gis 4 軟體架構 5 專案管理 為什麼要寫部落格呢?1 把自己知道的 學到的東西寫出來,留下一些 經驗之談 2 寫文章是一次思考的過程,是一次總結的過程,經過思考總結的東西才更加紮實 未來的發展是什麼?1 vr ar ...

為什麼這個地方這麼恐怖

這是乙個老的小區,經常看小區裡的人在那裡畫個圈燒紙。真是詭異,第一次半夜兩三點聽到兩個小孩打架,伴隨著哭聲,真的很恐怖!後來查了一下,別人說可能是貓叫,或許是吧,就這樣告訴自己,就這樣慢慢淡忘了。上個週日的晚上,也許是天氣熱吧,起來喝水,又是兩三點的樣子,又聽到這樣詭異的聲音,和上次完全不同,好像兩...

Safari 為什麼取這個名字

2012年新聞 到今天為止,我都不知道 safari 這個名字到底是誰的主意。2002年夏天,賈伯斯和蘋果管理層意識到我們即將完工,我們也確實能夠在當年末推出那款瀏覽器。但是在介面設計階段,討論的主題轉向了我們應該怎樣稱呼它。根據我的記憶,賈伯斯大聲地說出了好多個名字,但我建議他們走出去體會一下那些...