要消除未使用的(普通)功能,我可以使用: -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)? 也许我误会了什么。因此,我认为应该有一种方法来删除这个未使用的功能。如果是这样,请解释我为什么,当我不使用虚函数指针时,没有办法“摆脱”多态开销。 :)
仅供参考:此代码主要用于学习目的。
答案 0 :(得分:3)
感谢Jonathan Wakely我开始挖掘并找到了gcc选项:
-fvtable-GC 发出vtable和虚函数引用的特殊重定位,以便链接器可以识别未使用的虚函数,并将引用它们的vtable插槽清零。这对-ffunction-sections和-Wl,-gc-sections最有用,为了也丢弃函数本身。
但GCCv4.7.1
不支持答案 1 :(得分:0)
出于学习目的,我建议你学习语言元素的语义,并学会将它们用于他们的目的。即在那里使用虚拟你好想要多态,否则就把它们留下来。
担心链接器留下的死代码数量等问题可以安全地提前5到10年或永久保留。
优化每年都会有所改善,所以即使今天你可以在生产时发现0.01%的图像成为可能的浪费,它可能会自行消失。