C++ 链接器是否可以报告未使用的成员函数?(通用条款)

C++ 链接器是否可以报告未使用的成员函数?(通用条款),c++,optimization,gcc,linker,member-functions,C++,Optimization,Gcc,Linker,Member Functions,有30多个成员函数,可以在字符串对象上调用。 如果我只使用其中的几个呢 我假设未使用的成员函数不会占用可执行代码部分的空间。 我很想知道链接器是否可以确定未使用的成员函数,将其从编译的二进制文件中删除,并报告它丢弃了哪些函数。 有没有办法做到这一点?我正在查看,但找不到任何相关的内容。因为std::string是一个模板类(std::string只是typedeftostd::basic_string),只有使用过的方法才会被实例化,因此不会编译未使用的方法,因此无法从可执行文件中删除它们 关于

有30多个成员函数,可以在字符串对象上调用。
如果我只使用其中的几个呢

我假设未使用的成员函数不会占用可执行代码部分的空间。
我很想知道链接器是否可以确定未使用的成员函数,将其从编译的二进制文件中删除,并报告它丢弃了哪些函数。

有没有办法做到这一点?我正在查看,但找不到任何相关的内容。

因为
std::string
是一个模板类(
std::string
只是
typedef
to
std::basic_string
),只有使用过的方法才会被实例化,因此不会编译未使用的方法,因此无法从可执行文件中删除它们

关于非模板类:
virtual
函数始终会在可执行文件中结束,无论它们是否被调用,因为vtable需要地址。来自可执行库或静态链接库源的其他方法(以及自由函数)只有在实际使用时才会链接到二进制文件中。但据我所知,没有链接器标志来打印尚未链接的函数


另一方面,共享库(.so)必须包含所有(导出的)函数和方法,因为使用此共享库的二进制文件可以使用任何(导出的)函数。但是,由于一个共享库可以被许多可执行文件使用,同时只能加载到内存中一次,这通常是值得的。

标准库通常是共享的,因此它不会占用可执行文件中的任何空间

如果静态链接,那么,就链接器而言,非虚拟成员函数只是具有有趣名称的常规花园函数。无论链接器可以对普通函数做什么,它都可以对非虚拟成员做什么。我认为GNULD可能能够删除某些体系结构上未使用的功能,但不能删除其他体系结构上未使用的功能


当然,函数模板(例如
std::string
的成员)完全是另一回事。对于链接器来说,它们根本不是来自库,而是来自您的对象(并且只有您实例化的对象)。

这个答案并不完全涵盖您的情况,但是如果你想知道你的类中是否有任何未调用的函数,一些静态分析工具会报告这一点。

虚拟总是的假设有点言过其实。链接器知道是否未调用
Base::foo
,然后可以消除vtable插槽,从而
Derived::foo
。但是,如果实际上调用了
Base::foo
,则需要vtable插槽,并且实际上不可能消除
Derived::foo