为了消除未使用的(普通)功能,我可以使用: -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)? 也许我误解了什么。正因为如此,我认为应该有一种方法来删除这个未使用的功能。如果是这样,请解释一下为什么,当我不使用带有虚函数的指针时,无法“摆脱”多态开销。 :)
仅供参考:此代码主要用于学习目的。
感谢 Jonathan Wakely 我开始挖掘并找到了 gcc 选项:
-fvtable-gc 为虚函数表和虚函数引用发出特殊的重定位,以便链接器可以识别未使用的虚函数并将引用它们的虚函数表槽清零。这对于 -ffunction-sections 和 -Wl,--gc-sections 最有用,以便也丢弃函数本身。
但是GCCv4.7.1不支持
-flto: Enables link-time optimization.
可以帮助
出于学习目的,我建议您学习语言元素的语义并学习将它们用于其目的。 IE。在那里使用虚拟,你想要多态性,否则不要管它们。
担心诸如链接器留下的死代码数量之类的事情可以安全地保留到未来 5-10 年或永远。
优化每年都在进步,所以即使今天你可能会发现 0.01% 的图像在投入生产时可能是浪费,但它可能会自行消失。