【问题标题】:what is concept of Inline function and how it is differ from macro? [duplicate]什么是内联函数的概念,它与宏有何不同? [复制]
【发布时间】:2011-10-12 10:49:19
【问题描述】:

可能重复:
c++ inline function?

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

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

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

Edit: what is difference between macro & inline function? 

【问题讨论】:

标签: c++ c macros inline


【解决方案1】:

内联函数和非内联函数在语言上的主要区别在于,内联函数不受单一定义规则的约束,前提是所有定义都相同。

这是 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 也可以作为提示编译器用函数体的副本替换函数调用,但是编译器可以选择这样做或不这样做,这与你是否声明函数 @ 无关987654329@.

【讨论】:

    【解决方案2】:

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

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

    通常,内联函数比非内联函数稍快,因为不再有函数调用。对 getter/setter 很有用。

    【讨论】:

      【解决方案3】:

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

      有关更多信息以及何时/如何使用,请参阅Inline functions

      【讨论】:

        【解决方案4】:

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

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

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

        你这样调用函数:

            a = max(x, y);
        

        但是直接复制了一个内联函数,所以它会是这样的:

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

        【讨论】:

        【解决方案5】:

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

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

        类定义中定义的函数也是内联的,虽然没有明确的内联指令。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-18
          • 2021-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          相关资源
          最近更新 更多