要消除未使用的(普通)功能,可以使用: -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'这样的东西,它不可能丢弃未使用的虚拟函数,因为另一个翻译单元可能需要它们的定义。 –