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

news/2024/5/20 4:26:38 标签: 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 <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;
}

执行结果 :

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;


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


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

// 导入标准 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;
}

执行结果 :

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

在这里插入图片描述


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


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

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

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

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

执行过程如下 :

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

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

// 导入标准 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;
}

执行结果 :

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

在这里插入图片描述


http://www.niftyadmin.cn/n/4998284.html

相关文章

ARM架构Linux安装Openjdk11

打开终端或命令行界面。使用wget命令从GitHub下载OpenJDK文件。将以下命令中的<your_download_location>替换为你希望保存文件的本地目录。 wget -P <your_download_location> https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20.1%2…

ip地址、LINUX、与虚拟机

子网掩码&#xff0c;是用来固定网络号的&#xff0c;例如255&#xff0c;255,255,0&#xff0c;表明前面三段必须为网络号&#xff0c;后面必须是主机号&#xff0c;那么怎么实现网络复用呢&#xff0c;例如使用c类地址&#xff0c;但是正常子网掩码是255&#xff0c;255,255,…

jackson常用操作

#jackson常用操作 jackson序列化框架&#xff0c;一些常用的操作 依赖 <!--Jackson包--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.15.2</version></de…

C++算法 —— 动态规划(2)路径问题

文章目录 1、动规思路简介2、不同路径3、不同路径Ⅱ4、礼物的最大价值5、下降路径最小和6、最小路径和7、地下城游戏 1、动规思路简介 动规的思路有五个步骤&#xff0c;且最好画图来理解细节&#xff0c;不要怕麻烦。当你开始画图&#xff0c;仔细阅读题时&#xff0c;学习中…

Docker安装详细步骤

Docker安装详细步骤 1、安装环境准备 主机&#xff1a;192.168.40.5 zch01 设置主机名 # hostnamectl set-hostname zch01 && bash 配置hosts文件 [root ~]# vi /etc/hosts 添加如下内容&#xff1a; 192.168.40.5 zch01 关闭防火墙 [rootzch01 ~]# systemct…

代码随想录训练营第38天|509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

代码随想录训练营第38天|509. 斐波那契数&#xff0c;70. 爬楼梯&#xff0c;746. 使用最小花费爬楼梯 509.斐波那契数文章思路代码 70.爬楼梯文章思路代码 746.使用最小花费爬楼梯文章思路代码 总结 509.斐波那契数 文章 代码随想录|0509.斐波那契数 思路 两个变量记录前两…

教育培训小程序的设计与功能解析

随着互联网的发展&#xff0c;线上教育逐渐成为一种趋势&#xff0c;越来越多的人开始选择在线学习。而搭建一个适合自己的线上教育小程序&#xff0c;可以为教育机构或个人提供更好的教学和学习体验。在本文中&#xff0c;我们将介绍如何通过一个第三方制作平台来搭建在线教育…

学习ros机器人导航从精读nav2导航launch文件开始

nav2导航launch文件经过了多层套娃&#xff0c;真的是让初学者哭晕在厕所&#xff0c;今天我们就拆解一下他的launch文件&#xff0c;还原他最简单的状态&#xff0c;看看他到底启动了什么节点。 一 tb3仿真机器人启动文件&#xff1a;tb3_simulation_launch.py 1 文件目录结…