2013-07-02 38 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