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

时间:2011-10-12 10:49:19

标签: c++ c macros inline

  

可能重复:
  c++ inline function?

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

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

为什么&我应该在哪里使用内联函数?它与正常功能有何不同?

Edit: what is difference between macro & inline function? 

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

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

考虑这个标题:

// stupid.h
#ifndef H_STUPID
#define H_STUPID

int foo() { return 8; }

#endif
如果你不得不多次包含它,那么

stupid.h是不可用的,因为你最终会得到foo的多个定义。发表声明inline可以解决这个问题。将相同的逻辑应用于类定义(请记住,内联定义的所有成员函数都是隐式声明的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

答案 2 :(得分:1)

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

有关详细信息以及何时/如何使用,请参阅此Inline functions

答案 3 :(得分:1)

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

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

     inline int max(int a, int b)
     {
       return (a > b) ? a : b;
     }
你可以像这样调用函数:

    a = max(x, y);

但内联函数是直接复制的,所以就像这样:

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

答案 4 :(得分:1)

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

  1. 内联函数是类型安全的
  2. 由编译器决定是否内联内联函数
  3. 传递给内联函数的表达式只计算一次
  4. 虽然没有明确的内联指令,但在类定义中定义的函数也是内联的。