要消除未使用的(普通)功能,可以使用: -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)一些方法? 也許我誤解了一些東西。正因爲如此,我認爲應該有辦法去除這個未使用的功能。如果是這樣,請解釋爲什麼,當我不使用具有虛函數的指針時,無法「擺脫」多態開銷。 :)
供參考:此代碼主要用於學習目的。
如果你沒有,爲什麼你使用'virtual'在所有使用指針或引用,並基本上沒有動態調度則支持?似乎你誤解了'虛擬'。 [***什麼時候將C++中的函數標記爲虛擬?***](http://stackoverflow.com/questions/8298041/when-to-mark-a-function-in-c-asa-a-虛擬)應該是一個很好的閱讀。 –
我同意你關於'dummy'多態性的使用。我瞭解多態,但我想強制繼承的類來實現一些功能。我知道其他解決方案是在這種情況下使用模板。 換句話說,我寧願使用沒有多態的虛函數。 爲什麼我使用它並不是非常重要我寧願要學習和理解爲什麼我無法在連接期間擺脫這個功能。 – qubu
你似乎忘記給'main'一個返回類型。 GCC應該能夠「虛擬化」那些函數調用,因爲該對象的動態類型是已知的,但是沒有像'-fwhole-program'這樣的東西,它不可能丟棄未使用的虛擬函數,因爲另一個翻譯單元可能需要它們的定義。 –