2013-09-27 30 views
0

我有以下的基類,我檢查了這個類的大小,它顯示了16個字節。 如果我刪除虛擬關鍵字fun(),然後它顯示4字節。爲什麼基類的大小顯示16個字節?

我不理解這種行爲。任何指針?

class base 
{ 
     public : 
     int a; 
     virtual void fun() 
     { 
     } 
}; 

gcc版本:gcc版本4.1.2 20080704

操作系統:Linux 2.6.18-308.el5#1 SMP週五01月27日17時17分51秒EST 2012 x86_64的x86_64的x86_64的GNU/Linux的

回答

0

井「的指針」,實際上是猜對了。除了顯式聲明的數據字段之外,每個多態類還存儲一些額外的「隱藏」信息。在一個典型的實現中,它將存儲一個指向所謂的虛擬方法表(VMT)的指針。該指針的大小恰恰是在你的情況下爲該類的大小增加了額外的字節。

顯然,你是一個64,但平臺,它採用了8字節的指針上編譯代碼。因此,對於VMT指針,您的類的總大小爲8,int a字段爲4,另外4個填充字節將類大小與8字節邊界對齊。如果在32位模式下編譯代碼,則此類的sizeof可能評估爲8.

在單繼承層次結構中,所有類通常都會「共享」層次結構中最頂層多態類引入的指針,這意味着任何多態類的大小都會隨着單個指針的大小而增長。但是在多繼承層次結構中,最終可能會在一個類中包含多個隱藏的VMT指針,這意味着此類的大小將隨着多指針的大小而增大。

7

你的編譯器顯然是存儲每個實例來支持虛擬調度機器內部的指針(這是很常見的,它被稱爲v-表指針)。由於您使用的是64位架構,因此都會將8個字節添加到類的大小,並且還會使對齊8個字節。大小總是必須是對準的倍數以使陣列元件的對準工作,所以會有用於對準原因4個字節的填充,合計16。

1

若要實現虛擬方法多態行爲或虛擬基類在運行時,編譯器實現添加某些隱藏的成員。這是編譯器和平臺特定的行爲。任何多態類的大小可能因編譯器的不同實現而異。

這使得C++對象存儲器模型以C內存模型不兼容的。

相關問題