繁体   English   中英

跨多个 C++ 翻译单元的内联函数

[英]Inline functions across multiple C++ translation units

我最近学习了 C++ 中的内联函数。 我了解它们是如何工作的(在扩展代码而不是进行跳转等方面),但是当涉及到多个翻译单元 / *.cpp 文件时,我对如何使用它们感到有些困惑。

我已经读过,根据经验,我应该在头文件中包含函数本身的定义(而不仅仅是它的声明),然后在我打算使用所述内联函数的每个翻译单元中包含头文件。 对于内联函数来说,这不是问题,因为它只会在每个翻译中独立存在,并在需要时/如果需要(由编译器决定)进行扩展[如果我对此有任何错误,请纠正我!]

但是,我也读到在链接期间,即使头文件中不存在内联函数本身的定义,链接器也可以找到它的定义并在需要时扩展它。 但是链接器如何能够从不同的翻译单元扩展一个函数呢? 如果是这样,为什么我需要在每个翻译单元中包含函数的定义(通过头文件)?

函数前面的inline关键字只是编译器首选 inline 的可选指示符。 现代编译器在代码内联时并不关心inline关键字。

inline的重要含义是“允许多个定义”,如果成员函数定义在类的主体中,则隐式内联。

如果您在多个翻译单元中具有相同的函数定义,则需要inline (例如,如果您将函数定义放在一个标题中,并且该标题包含在多个 cpp 文件中)

我已经读过,根据经验,我应该在头文件中包含函数本身的定义(而不仅仅是它的声明),然后在我打算使用所述内联函数的每个翻译单元中包含头文件。 这对于内联函数来说不是问题,因为它只会在每个翻译中独立存在,并在需要时/如果需要(由编译器决定)扩展自身

将函数定义放在头文件中使工具链更容易进行内联,因为它在使用时知道其定义并且可以在编译步骤中执行内联。 在多个翻译单元中有一个函数定义需要用inline标记。

但是,我也读到在链接期间,即使头文件中不存在内联函数本身的定义,链接器也可以找到它的定义并在需要时扩展它。 但是链接器如何能够从不同的翻译单元扩展一个函数呢?

工具链可以对链接时(静态链接)的定义已知的任何函数(无论它们的定义在编译时是否已知)进行链接时优化(如内联),但链接时优化倾向于 - 在至少在过去 - 不如编译时优化有效。

链接时优化的问题是,工具链要么需要跟踪源代码提供的有助于优化的附加信息,要么需要依赖可能不太强大的策略,您可以在二进制文件上应用。

如果您有一个如下所示的main.cpp

int sum(int a, int b) {
  return a+b;
}

int main() {
  std::cout << sum(3,4) << std::endl;
  return 0;
}

任何现代编译器都会内联该代码(或者在这种情况下,事件将其完全优化为std::cout << 7 << std::endl; )。

这也将是好的和内联/优化:

总和

int sum(int a, int b) { // no inline keyword in front of the function
  return a+b;
}

主程序

#include "sum.h"
int main() {
  std::cout << sum(3,4) << std::endl;
  return 0;
}

但是一旦您在多个 cpp 文件中使用#include "sum.h"并将这些翻译单元链接在一起,您就会遇到问题并且需要使用inline 函数前面的inline现在实际上只是告诉链接器在多个翻译单元中具有相同的定义是您的意图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM