消除未使用的虚拟功能

时间:2013-07-02 19:06:22

标签: c++ gcc linker virtual-functions

要消除未使用的(普通)功能,我可以使用: -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)? 也许我误会了什么。因此,我认为应该有一种方法来删除这个未使用的功能。如果是这样,请解释我为什么,当我不使用虚函数指针时,没有办法“摆脱”多态开销。 :)

仅供参考:此代码主要用于学习目的。

2 个答案:

答案 0 :(得分:3)

感谢Jonathan Wakely我开始挖掘并找到了gcc选项:

  

-fvtable-GC       发出vtable和虚函数引用的特殊重定位,以便链接器可以识别未使用的虚函数,并将引用它们的vtable插槽清零。这对-ffunction-sections和-Wl,-gc-sections最有用,为了也丢弃函数本身。

但GCCv4.7.1

不支持

答案 1 :(得分:0)

出于学习目的,我建议你学习语言元素的语义,并学会将它们用于他们的目的。即在那里使用虚拟你好想要多态,否则就把它们留下来。

担心链接器留下的死代码数量等问题可以安全地提前5到10年或永久保留。

优化每年都会有所改善,所以即使今天你可以在生产时发现0.01%的图像成为可能的浪费,它可能会自行消失。