我可以选择性地(强制)内联函数吗?

新手上路,请多包涵

在《 清洁代码》 一书中(以及我遇到并阅读过的其他几本),建议将函数保持小,如果它们变大则将它们分解。它还建议函数应该只做一件事和一件事。

Optimizing software in C++ Agner Fog 中指出,他不喜欢仅仅因为函数越过一定的行数阈值就将其分解的规则。他指出,这会导致不必要的跳跃,从而降低性能。

首先,我明白,如果我正在处理的代码不是处于紧密循环中并且函数很重,因此调用它们所花费的时间与函数中的代码所花费的时间相比相形见绌。执行。但是让我们假设我正在使用大多数时候被其他对象/函数使用并且正在执行相对微不足道的任务的函数。这些功能遵循第一段中列出的建议(即执行一个单一功能并且很小/易于理解)。然后我开始编写一个性能关键函数,它在一个紧密的循环中利用这些其他函数,本质上是一个框架函数。最后,假设内联它们对性能关键功能有好处,但对任何其他功能没有任何好处(是的,我已经对此进行了分析,尽管我想避免大量复制和粘贴)。

马上,可以说标记函数 inline 并让编译器选择。但是,如果我不希望所有这些函数都在 ` .inl 文件中或在标头中公开怎么办?在我目前的情况下,性能关键函数和它使用的其他函数都在同一个源文件中。

总而言之,我是否可以选择性地(强制)内联单个函数的函数,以便最终代码表现得像一个大函数,而不是多次调用其他函数。

原文由 Samaursa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 499
2 个回答

您不能强制内联。此外,与完成工作的成本相比,现代 CPU 上的函数调用非常便宜。如果你的函数足够大以至于需要分解,那么执行调用所花费的额外时间将基本上没有。

如果做不到这一点,您可以…尝试…使用宏。

原文由 Puppy 发布,翻译遵循 CC BY-SA 3.0 许可协议

没有什么可以阻止您将 内联 放入 .cpp 文件中的静态函数中。

一些编译器可以选择强制使用内联函数,例如,参见 GCC 属性((always_inline)) 和大量选项来微调内联优化(参见 -minline-* 参数)。

我的建议是在任何你认为合适的地方使用 内联 甚至更好的 静态内联,并让编译器决定。他们通常做得很好。

原文由 rodrigo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题