2011-08-17 76 views
1

在單一繼承中,指向虛擬表的指針的大小總是等於void*的大小?說,虛擬函數表指針的大小是多少?

class vft { virtual ~vft(); } 
assert (sizeof(vft) == sizeof(void*)); 

這個斷言總是對的嗎?

+0

我認爲它至少是實現(編譯器)的依賴,所以並非總是如此。雖然這可能是合理的假設,但我相信你在進入vptr時會陷入危險的境地。 –

+0

不存在虛擬表或虛擬表指針(與C++相關)。斷言這種事物的存在是沒有意義的。 –

回答

2

C++ ISO標準沒有提到虛擬功能表指針。編譯器可以遵循這種機制來支持運行時多態,或者可以提出任何其他甚至不涉及vptr。它完全取決於編譯器編寫者。由於該標準沒有說明關於vptr的任何內容,它怎麼能說它的大小?沒門。結論是:你所做的(或假設的)不被語言所保證。但是,對於編譯器而言,其可能總是爲0,即

作爲你的編譯器的旁註,你怎麼能得出結論sizeof(vft)將等於sizeof(vptr)?這很可能是sizeof(vft) > sizeof(vptr)。儘管如此,我並沒有聲稱。

+0

哦,'vft'只是一個隨機的名字:) – neuront

+0

@neuront:我知道它的「隨機」名字。我的觀點是,爲什麼班級的大小應該等於'vptr'的大小?在你的例子中,'vft'是一個類名。 – Nawaz

+0

只是在我心中的另一個假設... – neuront

3

不,虛擬主義是實現定義的。這是一個編譯器實現細節。
所以你不能說永遠是真的。

而且,你應該寫任何代碼(如一個在問題)不要自己,假設是開放的標準作爲一個編譯器實現細節的細節,因爲這使你的代碼不是100%的可跨編譯器&甚至可能會在一些編譯器上大幅失敗。

1

這是依賴於實現的。

0

「這個說法總是對的嗎?」取決於你的意思是「永遠」。正如其他人已經指出的那樣,這是一個實現細節,即使對於同一個編譯器的不同版本,它也可能會發生變化。 C++標準沒有提到它,所以你不能依賴它。

另一方面,我從來沒有見過一個編譯器,這不會是真的。

+0

我有。在早期,虛擬表格仍在測試中,並且使用了其他技術。 –

0

除了其他人已經指出的事實,我覺得標準確實提供了一些保證。即,對於class vft { void* a, b; virtual ~vft(); },然後sizeof(vft) > sizeof(void*)。我敢肯定,這個標準至少保證了虛擬功能或者沒有。