我认为编译器/链接器会删除未在其类中使用的private
方法,并且这些方法不会成为最终二进制文件的一部分。
我创建了一个示例类,其中包含一个已实现但未使用的私有方法。
class XXX
{
public:
XXX();
private:
void MyUnusedMethod();
};
在实施文件中:
void XXX::MyUnusedMethod()
{
const char* hugo = "ABCCHARLYABC";
printf( hugo );
}
编译后,字符串仍然存在于最终二进制文件中。为什么?我该如何防止这种情况?
祝你好运, 查理
答案 0 :(得分:7)
一种可移植的方法是为每个函数提供一个.o文件。然后从那些.o文件中构建一个存档.a。当链接到该存档时,链接器仅链接那些解析符号的.o文件,即具有无人调用的函数的.o文件未链接。
另一种方法是将最新版本的gcc与link-time code generation一起使用。
答案 1 :(得分:7)
这通常是通过将 -ffunction-sections -fdata-sections 选项传递给gcc来完成的。查看此link了解更多详情。
答案 2 :(得分:3)
编译后,字符串仍然存在于最终二进制文件中。为什么
其他人已经提出了如何摆脱最终二进制文件中未使用的代码的建议。我想对Why
稍微给出一些答案 - 这里有两点可能无法删除该函数。
除非您使用static linkage声明了XXX
类型的所有对象,否则编译器无法从生成的目标文件中删除该类型(以及方法),因为某些其他目标文件可能会访问该值使用extern
。链接器可以一次查看所有目标文件,也许能够解决这个问题。
但是,由于您将问题标记为gcc
,因此您可能没有使用-fvisibility=hidden进行编译和/或链接。在这种情况下,即使链接器也不能剥离符号(因此也不能剥离代码),因为其他模块可能会在运行时解析符号。
答案 3 :(得分:1)
这可能是一个非常糟糕的主意,但无论如何我必须写它:)你可以创建一个模板化的类,将未使用的方法移除。