eliminate unused virtual functions
要消除未使用的(普通)功能,我可以使用:-功能部分,-fdata部分和--gc部分。它起作用了。
我知道使用多态性,函数是"后期绑定",所以我认为没有办法决定在链接过程中可以删除哪个函数。
但我使用纯虚函数强制继承的类实现一些函数。然后在代码中,我使用的是对象(不是对象的指针/引用,所以我不使用多态性)。
伪代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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(); } |
在链接过程中,是否有一些方法可以消除这些未使用的功能(还有其他功能)?也许我误解了什么。因此,我认为应该有一种方法来移除这个未使用的函数。如果是这样,请解释一下为什么,当我不使用带有虚拟函数的指针时,就没有办法"消除"多态开销。:)
仅供参考:此代码主要用于学习目的。
多亏了乔纳森·韦克利,我开始挖掘,找到了海湾合作委员会的选择:
-fvtable-gc
Emit special relocations for vtables and virtual function references so that the linker can identify unused virtual functions and zero out vtable slots that refer to them. This is most useful with -ffunction-sections and -Wl,--gc-sections, in order to also discard the functions themselves.
但GCCV4.7.1不支持
为了学习目的,我建议您学习语言元素的语义,并学习将它们用于其目的。也就是说,在那里使用虚拟,你需要多态性,否则就让它们单独存在。
担心诸如链接器留下的死代码数量之类的事情可以安全地保留到5-10年前或永远。
而且优化每年都在改进,所以即使今天你能找到0.01%的图像作为可能的浪费,到你开始生产的时候,它可能会自己消失。