zoukankan      html  css  js  c++  java
  • C++内联函数详解


    1.函数调用原理

    "编译过程的最终产品是可执行程序--由一组机器语言指令组成。运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。有时(如有循环和分支语句时),将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到另一个地址(函数的地址),并在函数结束时返回。下面更详细地介绍这一过程的典型实现。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入寄存器中),然后跳回到地址被保存的指令处(这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似)。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。"

    2.内联函数
    内联函数提供了另一种选择。编译器将使用相应的函数代码替换函数调用。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。

    3.内联函数的使用
    在函数声明前加上关键字inline;
    在函数定义前加上关键字inline。
    示例如下:

    #include<iostream>
    inline double square(double x){return x*x;}
    int main()
    {
        using namespace std;
        double a,b;
        double c = 13.0;
        a = square(5.0);
        b = square(4.5+7.5);
        cout<<"a="<<a<<",b="<<b<<endl;
        cout<<"c="<<c<<endl;
        cout<<"c squared="<<square(c++)<<endl;
        cout<<"now c="<<c<<endl;
        return 0;
    }

    程序输出结果如下:
    a=25,b=144
    c=13
    c square=169
    now c=14

    4.内联函数与宏定义的区别
    C语言使用预处理器语句#define来提供宏。如下例所示:
    #define SQUARE(X) X*X
    宏定义时通过文本替换开实现的--X是参数的符号标记。
    a = square(5.0);->a=5.0*5.0;
    b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
    d = square(c++);->d=c++*c++
    可以看出,对于b,需要使用括号才能正常运算。
    #define SQUARE(X) ((X)*(X))
    对于c,却仍递增了两次。
    因此,宏定义和内联函数存在本质的区别,转换的时候应考虑是否转换后功能是否正常

    5.什么时候使用内联函数
    如果执行函数代码的时间比处理函数调用机制的时间长,则节省的时间占比很小。若代码执行时间很短,则内联函数就可以节省函数调用的时间。

    参考资料:《C++ Primer.Plus》 pp.253-255

  • 相关阅读:
    查找1
    动态规划
    分治
    [LeetCode] 1339. Maximum Product of Splitted Binary Tree
    [LeetCode] 1509. Minimum Difference Between Largest and Smallest Value in Three Moves
    [LeetCode] 233. Number of Digit One
    [LeetCode] 1963. Minimum Number of Swaps to Make the String Balanced
    [LeetCode] 1053. Previous Permutation With One Swap
    [LeetCode] 1962. Remove Stones to Minimize the Total
    [LeetCode] 1961. Check If String Is a Prefix of Array
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/5523224.html
Copyright © 2011-2022 走看看