• 【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )






    一、内联函数总结



    回顾下 之前的博客中 介绍的 内联函数 :

    • 内联函数编译 : C++ 编译器 编译 内联函数 时 , 会直接 将 内联函数 函数体 指令插入到 调用 内联函数 的位置 ;
    • 内联请求会被拒绝 : 使用 inline 关键字 修饰 普通函数 , 将其转化为 内联函数 , 编译器不一定同意该 内联请求 , 如果 有循环语句 / 有很多条件判定语句 / 函数体庞大 / 对函数取地址操作 / 单独声明内联函数 , 即使写了 inline 内联函数 , 编译器也不会同意内联请求 ;
    • 内联函数优势 : 内联函数 与 普通函数 对比 , 其优势只是 省去了 函数调用时 的 压栈 / 跳转 / 返回 的开销 ;




    二、内联函数代码示例




    1、代码示例 - 普通函数执行分析


    调用 int c = fun1(++a, b); 代码 , fun1 是 普通函数 ;

    执行时 ,

    首先 , 执行 a 的自增 , 之后变量 a = 2 ;

    然后 , 执行 fun1 普通函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 普通函数 ;

    最后 , 普通函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;

    因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;


    代码示例 - 内联函数执行分析 :

    // 导入标准 io 流头文件 其中定义了 std 命名空间
    #include 
    // 导入 std 命名空间
    using namespace std;
    
    // 声明内联函数 不会报错 程序能正常运行
    // 但是不建议这样做
    // 一旦像这样声明 内联函数 
    // 编译器 编译时 会拒绝该内联函数的 内联请求 
    // 将其作为普通函数处理
    //inline int fun(int a, int b);
    
    // 宏代码片段 : 获取 a 和 b 中较小的值
    #define FUN(a, b) ((a) < (b) ? (a) : (b))
    
    // 内联函数 : 获取 a 和 b 中较小的值
    inline int fun(int a, int b)
    {
        return a < b ? a : b;
    }
    
    // 普通函数 : 获取 a 和 b 中较小的值
    inline int fun1(int a, int b)
    {
        return a < b ? a : b;
    }
    
    int main() {
    
        
        int a = 1;
        int b = 3;
    
        // 调用普通函数
        // 此时先执行 a 的自增 a = 2
        // 然后再执行函数 , 将 a = 2 , b = 3 传入
        // 结果得到 a b 中较小的值 c = a = 2
        int c = fun1(++a, b);
    
        // 打印内联函数调用结果
        printf("a = %d, b = %d, c = %d\n", a, b, c);
    
        // 控制台暂停
        system("pause");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行结果 :

    a = 2, b = 3, c = 2
    请按任意键继续. . .
    
    • 1
    • 2

    在这里插入图片描述


    2、代码示例 - 内联函数执行分析


    调用 int c = fun(++a, b); 代码 , fun 是 内联函数 ;

    执行时 ,

    首先 , 执行 a 的自增 , 之后变量 a = 2 ;

    然后 , 执行 fun 内联函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 内联函数 ;

    最后 , 内联函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;

    因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;


    内联函数 的 执行结果 , 与 普通函数 的执行结果是一样的 ;


    代码示例 - 内联函数执行分析 :

    // 导入标准 io 流头文件 其中定义了 std 命名空间
    #include 
    // 导入 std 命名空间
    using namespace std;
    
    // 声明内联函数 不会报错 程序能正常运行
    // 但是不建议这样做
    // 一旦像这样声明 内联函数 
    // 编译器 编译时 会拒绝该内联函数的 内联请求 
    // 将其作为普通函数处理
    //inline int fun(int a, int b);
    
    // 宏代码片段 : 获取 a 和 b 中较小的值
    #define FUN(a, b) ((a) < (b) ? (a) : (b))
    
    // 内联函数 : 获取 a 和 b 中较小的值
    inline int fun(int a, int b)
    {
        return a < b ? a : b;
    }
    
    // 普通函数 : 获取 a 和 b 中较小的值
    inline int fun1(int a, int b)
    {
        return a < b ? a : b;
    }
    
    int main() {
    
        
        int a = 1;
        int b = 3;
    
        // 调用内联函数
        // 此时先执行 a 的自增 a = 2
        // 然后再执行函数 , 将 a = 2 , b = 3 传入
        // 结果得到 a b 中较小的值 c = a = 2
        int c = fun(++a, b);
    
        // 打印内联函数调用结果
        printf("a = %d, b = %d, c = %d\n", a, b, c);
    
        // 控制台暂停
        system("pause");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行结果 :

    a = 2, b = 3, c = 2
    请按任意键继续. . .
    
    • 1
    • 2

    在这里插入图片描述


    3、代码示例 - 宏代码片段执行分析


    执行 int c = FUN(++a, b); 代码 , 调用宏代码片段 ;

    宏代码片段在 预编译阶段 机械的将宏展开 , 宏替换很机械 ;

    宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置 ,

    ((++a) < (b) ? (++a) : (b))
    
    • 1

    执行过程如下 :

    • 首先 , 执行 ++a 变为 2 ;
    • 然后 , 比较 2 < 3 , 返回结果是 (++a) 此时又要自增一次 a 变为 3 ;
    • 最后 , a = 3 返回 , 最小值为 3 ;

    代码示例 - 宏代码片段执行分析 :

    // 导入标准 io 流头文件 其中定义了 std 命名空间
    #include 
    // 导入 std 命名空间
    using namespace std;
    
    // 声明内联函数 不会报错 程序能正常运行
    // 但是不建议这样做
    // 一旦像这样声明 内联函数 
    // 编译器 编译时 会拒绝该内联函数的 内联请求 
    // 将其作为普通函数处理
    //inline int fun(int a, int b);
    
    // 宏代码片段 : 获取 a 和 b 中较小的值
    #define FUN(a, b) ((a) < (b) ? (a) : (b))
    
    // 内联函数 : 获取 a 和 b 中较小的值
    inline int fun(int a, int b)
    {
        return a < b ? a : b;
    }
    
    // 普通函数 : 获取 a 和 b 中较小的值
    inline int fun1(int a, int b)
    {
        return a < b ? a : b;
    }
    
    int main() {
    
        
        int a = 1;
        int b = 3;
    
        // 调用宏代码片段
        // 机械的将宏展开 , 宏替换很机械 
        // 宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置
        // ((++a) < (b) ? (++a) : (b))
        // 首先 , 执行 ++a 变为 2 , 
        // 然后 , 比较  2 < 3 , 返回结果是 (++a) 此时又要自增一次 a 变为 3
        // 最后 , a = 3 返回 , 最小值为 3
        int c = FUN(++a, b);
    
        // 打印内联函数调用结果
        printf("a = %d, b = %d, c = %d\n", a, b, c);
    
        // 控制台暂停
        system("pause");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    执行结果 :

    a = 3, b = 3, c = 3
    请按任意键继续. . .
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    MySQL 8.0.35 企业版比社区版性能高出 25%?
    运营商三网精准大数据实时截流之网站实时数据
    Java面试题大全(整理版)1000+面试题附答案详解最全面看完稳了
    8个提高摸鱼效率的python自动化脚本,提高打工人幸福感~
    058:mapboxGL监听键盘事件,通过panBy控制前后左右移动
    智云通CRM:客户说“别人家的便宜”,如何有效回应?
    系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第八部分:Linux、安全
    全面总结C++类模板使用的基础知识
    Java&线程&协程
    ResNet——Deep Residual Learning for Image Recognition(论文阅读)
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132655552