什么是内联函数的概念以及它与宏的不同之处?

可能重复:
c ++内联函数?

内联函数的真正概念是什么?

我真的无法理解内联函数。

为什么我应该使用内联函数? 它与正常function有何不同?

Edit: what is difference between macro & inline function? 

内联函数和非内联函数之间的主要语言差异是,如果所有定义都相同,则内联函数不受单定义规则的约束。

这是C ++的一个重要特性,因为它允许您在类定义中编写成员函数定义,并且仍然能够在头文件中包含类定义。

考虑这个标题:

 // stupid.h #ifndef H_STUPID #define H_STUPID int foo() { return 8; } #endif 

如果你不得不多次包含它,stupid.h是不可用的,因为你最终会得到foo多个定义。 使inline声明可以解决这个问题。 将相同的逻辑应用于类定义(请记住,内联定义的所有成员函数都是内联隐式声明的),这允许我们编写:

 // works.h #ifndef H_WORKS #define H_WORKS class Foo { int n; public: void f() { n *= 2; } // implicitly inline! int g() const { return n; } // ditto }; #endif 

我们可以在尽可能多的翻译单元中包含works.h,并且Foo::fFoo::g没有“多重定义”错误,因为它们是(隐式地)内联声明的。

当然, inline也可以作为编译器的一个提示,用函数体的副本替换函数调用,但是编译器可以选择做或不做,几乎与你是否声明函数inline无关。

非内联函数编译为该函数的实际调用。 内联函数基本上是在inplace(内联)中复制的,因此符号表中没有调用且没有符号。

因此,必须在头文件中声明内联函数,因为一旦编译它,就没有对它的引用。 例如,您无法从其他目标文件链接到它。

通常,内联函数比非内联函数稍快,因为不再有函数调用。 对吸气剂/孵化器有用。

在C和C ++编程语言的各种版本中,内联函数是已请求编译器执行内联扩展的函数。 换句话说,程序员已经请求编译器在调用函数的每个位置插入函数的完整主体,而不是生成代码以在定义它的一个位置调用函数。 (但是,编译器没有义务尊重此请求。)

有关更多信息以及何时/如何使用,请参阅此内联函数

内联函数是编译器将函数定义中的代码直接复制到调用函数的代码而不是在内存中创建单独的指令集的函数。 不是将控制转移到function代码段和从function代码段转移控制,而是可以直接替换函数体的修改副本用于函数调用。 这样,避免了函数调用的性能开销。

如果你使用这样的普通函数:

  inline int max(int a, int b) { return (a > b) ? a : b; } 

你这样调用函数:

  a = max(x, y); 

但直接复制内联函数,因此它将如下所示:

  a = (x > y) ? x : y; 

当您希望优化函数调用时,应使用内联函数。 您可以将内联函数视为将函数内容(内联)复制到调用函数的代码段的宏。 但是,内联函数与宏(google it up)非常不同。 一些主要差异:

  1. 内联函数是类型安全的
  2. 编译器可以选择是否内联内联函数
  3. 传递给内联函数的表达式只计算一次

尽管没有明确的内联指令,但类定义中定义的函数也是内联的。