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

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

4

2 回答 2

4

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

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

但在 GCCv4.7.1 中不支持

于 2013-07-03T10:27:08.110 回答
-1

出于学习目的,我建议您学习语言元素的语义并学习将它们用于其目的。即在你想要多态性的地方使用虚拟,否则不要管它们。

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

并且优化每年都在改进,所以即使今天你可以在投入生产时发现 0.01% 的图像可能是浪费,它也可能会自行消失。

于 2013-07-02T19:47:04.473 回答