2013-07-02 35 views
3

要消除未使用的(普通)功能,可以使用: -ffunction-sections,-fdata-section和-gc-sections。 ,它的工作原理。消除未使用的虛擬功能

我知道,使用多態性,函數是'遲綁定',所以我想沒有辦法決定哪些函數可以在鏈接過程中刪除。

但是我使用純虛函數強制繼承的類來實現一些功能。然後在代碼中我使用的對象(不是指針/對象的引用,所以我沒有使用多態)。

僞代碼:

class BASE { 
    ... 
    virtual void do_sth() = 0; 
    virtual void do_sth_else() = 0; 
    ... 
}; 

class C1 : BASE { 
    ... 
    void do_sth() { //some code } 
    void do_sth_else() { //some code } 
} 

main() 
{ 
    //the do_sth_else function is never used in main 
    C1 obj1; 
    obj.do_sth(); 
} 

是否有消除在聯動處理此未使用的函數(do_sth_else)一些方法? 也許我誤解了一些東西。正因爲如此,我認爲應該有辦法去除這個未使用的功能。如果是這樣,請解釋爲什麼,當我不使用具有虛函數的指針時,無法「擺脫」多態開銷。 :)

供參考:此代碼主要用於學習目的。

+5

如果你沒有,爲什麼你使用'virtual'在所有使用指針或引用,並基本上沒有動態調度則支持?似乎你誤解了'虛擬'。 [***什麼時候將C++中的函數標記爲虛擬?***](http://stackoverflow.com/questions/8298041/when-to-mark-a-function-in-c-asa-a-虛擬)應該是一個很好的閱讀。 –

+0

我同意你關於'dummy'多態性的使用。我瞭解多態,但我想強制繼承的類來實現一些功能。我知道其他解決方案是在這種情況下使用模板。 換句話說,我寧願使用沒有多態的虛函數。 爲什麼我使用它並不是非常重要我寧願要學習和理解爲什麼我無法在連接期間擺脫這個功能。 – qubu

+1

你似乎忘記給'main'一個返回類型。 GCC應該能夠「虛擬化」那些函數調用,因爲該對象的動態類型是已知的,但是沒有像'-fwhole-program'這樣的東西,它不可能丟棄未使用的虛擬函數,因爲另一個翻譯單元可能需要它們的定義。 –

回答

0

爲了學習的目的,我建議你學習語言元素的語義,並學習如何使用它們。即在那裏使用虛擬喲想要多態性,並保持其他方式。

擔心鏈接器留下的死碼數量可以安全地保留5-10年或永遠。

並且優化每年都在改進,所以即使今天你可以在圖像中找到0.01%的圖像,但是到達產品的時候它可能只會自行消失。

+0

我知道優化常常比每年和其他編譯器都改善,而不是gcc處理一些不同的方式... 我通常使用uC和C代碼。我正在做一些C++實驗,並試圖在像這樣的特殊情況下專注於C++開銷。但是,感謝您的回答 – qubu

3

感謝Jonathan Wakely我開始挖,我發現gcc的選項:

-fvtable-GC :發射虛函數表和虛函數的引用,以便鏈接能夠識別未使用的虛函數和歸零虛函數表插槽的特殊遷移指的是他們。這對於-ffunction-sections和-Wl,-gc-sections是非常有用的,以便也可以丟棄這些函數本身。

但它不是在GCCv4.7.1

+0

另請參見[在GCC中替換爲「fvtable-gc」](http://stackoverflow.com/q/17445907/1468366) – MvG