我想知道是否存在一種可能的優化,即編譯器不需要將vptr分配給實例化對象,即使對象的類型是具有虛擬方法的類。是否有類聲明虛方法並且編譯器不需要使用vptr的情況?
例如考慮:
#include <iostream>
struct FooBase
{
virtual void bar()=0;
};
struct FooDerived : public FooBase
{
virtual void bar() { std::cout << "FooDerived::bar()\n"; }
};
int main()
{
FooBase* pFoo = new FooDerived();
pFoo->bar();
return 0;
}
在這個例子中,編譯器肯定知道會是怎樣的PFOO在編譯時的類型,所以它並不需要使用的vptr爲PFOO,對不對? 有沒有更有趣的情況下,編譯器可以避免使用vptr?
進一步詳細說明,FooBase和FooDerived類不能有多個版本(內存佈局),或者不同的編譯單元可能不兼容。因爲有可能從非常見的基本指針調用的虛擬函數,所以編譯器必須爲vtable分配空間,這意味着vtable必須存在於該對象的所有實例中 - 即使在您的示例中也是如此。 – 2010-02-25 17:59:27