C++ 链接是否足够智能,可以避免链接未使用的库?

2024-01-25

我还远没有完全理解 C++ 链接器的工作原理,并且我有一个关于它的具体问题。

假设我有以下内容:

Utils.h

namespace Utils
{
    void func1();
    void func2();
}

实用程序.cpp

#include "some_huge_lib" // Needed only by func2()

namespace Utils
{
    void func1() { /* Do something */ }
    void func2() { /* Make use of some functions defined in some_huge_lib */ }
}

main.cpp

int main()
{
    Utils::func1();
}

我的目标是生成尽可能小的二进制文件。

Will some_huge_lib包含在输出目标文件中?


包含或链接大型库通常不会产生影响,除非您use那个东西。连接器should执行死代码消除,从而确保在构建时您不会获得包含大量未使用代码的大型二进制文件(请阅读编译器/链接器手册以了解更多信息,这不是由 C++ 标准强制执行的)。

包含大量标头也不会增加二进制文件的大小(但可能会大大增加编译时间,参见预编译标头)。一些例外代表全局对象和动态库(这些不能被剥离)。我也推荐阅读这段话 https://stackoverflow.com/a/6770305/1938163 (gcc only)关于将代码分成多个部分。

关于性能的最后一个注意事项:如果您使用lot位置相关代码(即不能仅映射到具有相对偏移的任何地址但需要通过重定位或类似表进行一些“热修补”的代码),那么将会产生启动成本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 链接是否足够智能,可以避免链接未使用的库? 的相关文章

随机推荐