2016-11-15 78 views
0

虛函數時使用的虛表下面是一個例子:呼籲靜態分配的對象

struct A { 
    virtual int f() const { return 1; } 
}; 

struct B : A { 
    virtual int f() const { return 2; } 
}; 

int main() { 
    B b; 
    cout << b.f() << endl; 
} 

是否有將要發生的調用f()上的B,或不實例虛擬查表?或者有可能,但編譯器可以優化它嗎?

+1

爲了使多態性正常工作,您需要一個指向基類的指針或引用。在你的情況下,不需要虛擬表查找,編譯器可以自由優化它。 –

+2

由於C++標準沒有指定「虛擬表查找」,所以從您展示的C++程序的角度來看,很難回答這個問題。這可能更適合作爲編譯器供應商關於特定編譯器的問題。 –

+3

以上都不是,因爲'B :: f'是私人的。 :P – aschepler

回答

2

取決於編譯器和優化選項。通常,當一個現代編譯器知道對象的派生類型最多時,它將優化對對象的直接虛擬調用(間接尋址)。

+0

@KerrekSB:謝謝,我的意思是寫「最衍生」。抱歉。這是一個由C + 11§1.8/ 4中的標準定義的術語。 –