前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )

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

作者头像
韩曙亮
发布2023-10-15 16:47:29
发布2023-10-15 16:47:29
39900
代码可运行
举报
运行总次数:0
代码可运行

一、内联函数总结

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

  • 内联函数编译 : 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;

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

代码语言:javascript
代码运行次数:0
复制
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 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;
}

执行结果 :

代码语言:javascript
代码运行次数:0
复制
a = 2, b = 3, c = 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;

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

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

代码语言:javascript
代码运行次数:0
复制
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 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;
}

执行结果 :

代码语言:javascript
代码运行次数:0
复制
a = 2, b = 3, c = 2
请按任意键继续. . .

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

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

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

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

代码语言:javascript
代码运行次数:0
复制
((++a) < (b) ? (++a) : (b))

执行过程如下 :

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

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

代码语言:javascript
代码运行次数:0
复制
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 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;
}

执行结果 :

代码语言:javascript
代码运行次数:0
复制
a = 3, b = 3, c = 3
请按任意键继续. . .
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、内联函数总结
  • 二、内联函数代码示例
    • 1、代码示例 - 普通函数执行分析
    • 2、代码示例 - 内联函数执行分析
    • 3、代码示例 - 宏代码片段执行分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档