【发布时间】:2020-10-16 11:53:06
【问题描述】:
我最近了解了 C++ 中的内联函数。我了解它们是如何工作的(在扩展代码而不是进行跳转等方面),但是当涉及到多个翻译单元/*.cpp 文件时我应该如何使用它们有点困惑。
我已经读过,根据经验,我应该在头文件中包含函数本身的定义(而不仅仅是它的声明),然后在我打算使用的每个翻译单元中包含头文件内联函数。这对于内联函数来说不是问题,因为它只会在每个翻译中独立存在并在需要时/如果需要(由编译器决定)自行扩展[如果我对此有任何错误,请纠正我!]
但是,我还读到,在链接期间,即使内联函数本身的定义不存在于头文件中,链接器也可以找到它的定义并在需要时对其进行扩展。但是链接器如何能够从不同的翻译单元扩展功能呢?如果是这样的话,为什么我需要在每个翻译单元中包含函数的定义(通过头文件)?
【问题讨论】:
-
“内联”有两种含义,我不确定您是否知道其中的区别。编译器是否内联函数调用现在完全取决于编译器(与
inline关键字无关)。您可以给编译器一个提示,但是编译器只是忽略它,因为它更清楚内联什么和不内联。inline关键字是为了能够在 headers 中定义函数 -
请对Interprocedural optimization做一些研究。尤其是 LTO(链接时间优化)。
-
我确实不知道这个@idclev463035818 但是,如果我在头文件中将函数定义为内联函数,它现在会在每个函数调用上扩展(仍然)而不是每次都跳转?另外,我仍然有点困惑链接器如何在链接期间内联定义为不同翻译单元的函数? (假设我们只在其中一个转换单元中定义了函数)
-
如果您在标头中将函数声明为
inline,那么它可能是内联的,也可能不是内联的;)我知道这很混乱,这是由于历史原因。过去inline确实是用来判断方法是否应该在每次调用时内联。