- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一些速度非常重要的代码。我只是在编写测试用例后开始制作主二进制文件。对于我的测试运行器,我只是将所有内容都提供给带有通配符的链接器。 (如下)
在我看来,链接是 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 不会这样做),您可以执行以下操作:
-fdata-sections
和 -ffunction-sections
标志构建目标文件(有关详细信息,请参阅 GCC manual );-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/
我正在编写一个快速的 preg_replace 来从 CSS 中删除注释。 CSS 注释通常有这样的语法: /* Development Classes*/ /* Un-comment me for
使用 MySQL,我有三个表: 项目: ID name 1 "birthday party" 2 "soccer match" 3 "wine tasting evening" 4
我是一名优秀的程序员,十分优秀!