【问题标题】:C/C++ static function vs non-static function impact on linking timeC/C++ 静态函数与非静态函数对链接时间的影响
【发布时间】:2021-08-27 18:51:12
【问题描述】:

函数通常被声明为非静态的,因为它们可能在其他目标文件中被调用。

我只是好奇有没有

  • 仅在源文件中定义和使用的几个函数,
  • 拥有许多此类源文件并且
  • 将这些函数声明为静态而不是非静态,

这将改善链接时间。如果只在同一个源文件中使用和定义,是否值得将它们设为静态?

【问题讨论】:

  • 是的。不仅因为链接时间,还因为 ODR。
  • 它将减少符号表的大小和修正的数量,简化链接器的工作。链接时间的改进不太可能值得更改源代码。
  • 作为一般规则,我会说函数和其他符号最好定义为静态或默认设置为“不可见”。如果有必要在外部引用它们,则需要将其提升为非静态或可见的。这不是为了缩短链接时间,而是为了提高(内部或外部)API 的稳定性。
  • 而不是声明内部函数 static 使用未命名的 namespace 请参阅 en.cppreference.com/w/cpp/language/namespace#Unnamed_namespaces "...未命名的命名空间以及在未命名的命名空间中直接或间接声明的所有命名空间都有内部链接,...”
  • @Cheatah Well API 分离是另一个话题。

标签: c++ c function static linker


【解决方案1】:

如果一个函数在单个源文件中定义和使用,它应该始终是静态的,或者在匿名命名空间中定义。这是因为您有违反 ODR 的风险。此外,如果可以在任何地方内联,这允许编译器从二进制文件中完全删除该函数。这对于非静态函数是不可能的。

关于链接时间,您可能应该对其进行分析。

【讨论】:

  • 链接时间是这里的重点。在需要数小时才能构建的大型项目中,很难进行概要分析,因为在每种情况下都更改静态限定符是不可行的。在小型项目中,链接时间之间的差异可能微不足道。
  • @Flaviu 微不足道,但可以衡量,对吧?创建一个中等大小的基准(可能由脚本生成)以了解总体思路应该不会太难。
  • 生成许多具有许多功能的源文件,这些功能只会打印一些东西,这是个好主意。可以做到。
猜你喜欢
  • 2021-10-20
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多