gpt4 book ai didi

c++ - 编译器会优化掉未使用的链接文件吗?

转载 作者:太空狗 更新时间:2023-10-29 21:01:10 28 4
gpt4 key购买 nike

我正在编写一些速度非常重要的代码。我只是在编写测​​试用例后开始制作主二进制文件。对于我的测试运行器,我只是将所有内容都提供给带有通配符的链接器。 (如下)

在我看来,链接是 C++ 将事物粘合在一起的阶段 - 填充对函数等的引用并将所有内容放在一起以生成二进制文件。

# Do the linking for the test binary
$(BIN)test_cases: $(TEST)TestRunner.o
$(CC) $(TEST)*.o $(SRC)*.o $(CPPUNITLINKS) $(MAINLINKS) -o $(BIN)test_cases

我的问题是,鉴于我希望以任何可能的方式加速我的程序,我是否最好链接“主”二进制文件所需的最低限度文件?这会导致更精简的可执行文件或更快的程序,还是编译器已经有效地丢弃了它不需要的任何东西?

最佳答案

当您将目标文件链接到程序中时,链接器将解析程序中所有未解析的符号。如果您想消除死代码(默认情况下 GCC 不会这样做),您可以执行以下操作:

  1. 使用 -fdata-sections-ffunction-sections 标志构建目标文件(有关详细信息,请参阅 GCC manual );
  2. 使用 -Wl,--gc-sections 优化标志链接目标文件,该标志告诉链接器丢弃未引用的部分。

注意:只有未使用的 static 函数会自动删除。

理论上,冗余符号的存在只会影响生成程序的大小。然而,我偶然发现了一些帖子,人们报告说在剥离无用代码后性能提高了 1% 到 2%。当然,代码库必须足够大才能注意到这种效果。

请注意,有时这种方法可能无法正常工作。例如,我在某些系统上遇到过崩溃或链接问题,可能是由于此功能的实现过程中存在错误。

此外,不要认为这些标志在所有情况下都能提高性能和/或大小。有充分的理由可以通过标志打开此功能,而默认情况下不存在。实际上,有时链接器可能会创建更大的对象和可执行文件和/或更慢的代码,更不用说您肯定也会遇到调试问题。

总而言之,在使用此功能时要非常谨慎,并始终按照其他答案中的建议前后分析您的代码。

最后,如果你真的追求速度,你可以查看 my other answer on some useful GCC optimization flags .

最后但同样重要的是,所谓的链接时间优化 (LTO) 是一个巨大的新概念,它已被引入 GCC,并且最近变得或多或少地稳定使用。相应的标志是 -lto,参见 here here 获取更多信息。虽然现在它是可用的,但在某些平台上并不是所有的东西都是 Shiny 的。例如,在 Windows 上,GCC 端口 MinGW/MinGW-w64 仍在努力使 LTO 支持生产质量。

关于c++ - 编译器会优化掉未使用的链接文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com