使用-O3编译时,将函数标记为内联

Marking a function as inline when compiling with -O3?

本文关键字:记为 函数 -O3 编译 使用      更新时间:2023-10-16

C++允许您用inline关键字注释函数。据我所知,这为编译器提供了内联函数的提示(但没有义务),从而避免了小的函数调用开销。

我有一些方法经常被调用,所以它们真的应该被内联。但是inline注释的函数需要在头中实现,所以这使得代码的排列不太好。此外,我认为内联是一种编译器优化,应该在有意义的地方对程序员透明地进行。

那么,我必须用inline注释我的函数才能进行内联吗?或者,当我用-O3或其他适当的优化标志编译时,GCC在没有注释的情况下解决了这个问题吗?

inline只是对编译器的一个建议是不正确的&具有误导性。内联标记函数有两种可能的影响:

  1. 将函数定义内联替换为进行函数调用的位置&
  2. 某些放宽w.r.t一个定义规则,允许您在头文件中定义函数

编译器可以执行也可以不执行#1,但必须遵守#2。所以内联不仅仅是一个建议。一旦函数被标记为内联,就会应用一些规则。

一般来说,不要为了优化而将函数标记为inline。大多数现代编译器都会在没有您帮助的情况下自行执行这些优化。如果希望将函数包含在头文件中,请将其标记为inline,因为这是在不破坏ODR的情况下将函数定义包含在头中的唯一正确方法。

常见的民间传说是,gcc总是自己决定(基于一些成本启发式)是否内联(取决于编译器/链接器选项,它甚至可以在链接时这样做)。您有时可以在使用-Winline时观察到这一点,其中gcc警告内联提示被忽略,它甚至经常给出原因。

如果你想知道到底发生了什么,你可能必须阅读它的源代码,或者接受读过它的人的话。