为了消除未使用的(普通)函数,我可以使用以下选项:-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)?也许我误解了什么,因为我认为应该有一种方法来删除这个未使用的函数。如果可以,请解释一下当我不使用带有虚拟函数指针时,为什么没有办法"摆脱"多态开销。
顺便提一下,此代码主要是用于学习目的。
virtual
呢?似乎你误解了virtual
。阅读在C++中何时将函数标记为虚拟?会是一个不错的选择。 - Alok Savemain
指定返回类型。GCC 应该能够“去虚拟化”那些函数调用,因为对象的动态类型是已知的,但是如果没有像-fwhole-program
这样的东西,它不太可能丢弃未使用的虚拟函数,因为另一个翻译单元可能需要它们的定义。 - Jonathan Wakely