前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )

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

作者头像
韩曙亮
发布于 2023-10-15 08:47:29
发布于 2023-10-15 08:47:29
54300
代码可运行
举报
运行总次数: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
运行
AI代码解释
复制
// 导入标准 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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
// 导入标准 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
运行
AI代码解释
复制
a = 2, b = 3, c = 2
请按任意键继续. . .

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

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

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

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

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

执行过程如下 :

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

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C语言内联函数,提升C技巧必备
内联函数是C语言从C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。本篇文章就来讲解下内联函数,赶紧来看下吧!
混说Linux
2023/02/24
8890
C语言内联函数,提升C技巧必备
【C++】内联函数
在C语言中,为了解决类似的问题,我们学习了使用类函数宏来替换这些大量重复使用但又并不复杂的函数,如,将求两数中的最大值的函数改写为类函数宏:
修修修也
2024/04/01
1320
【C++】内联函数
【C++入门】—— C++入门 (下)_内联函数
前言:在了解完前面的C++基础内容后,马上我们就要真正不如C++的学习了,但在之前让我们最后了解最后一点点C++入门知识!来迟的520特别篇!
Eternity._
2024/06/14
1170
【C++入门】—— C++入门 (下)_内联函数
C++之内联函数
  C++继承C的一个重要特性是效率,在C中保护效率的一个方法是使用宏(macro),宏的实现是使用预处理器而不是编译器,预处理器直接用宏代码替换宏调用,所以就没有了参数压栈、生成汇编语言的CALL、返回参数、执行汇编语言的RETURN的时间花费,所有的工作由预处理器完成,因此不用花费什么就具有了程序调用的便利和可读性。
全栈程序员站长
2022/07/14
3640
【c++入门】内联函数 和 函数重载 详解!
在上一篇文章中我们了解到了命名空间和缺省函数的存在,以及C++为什么要引入它们。本章将继续C++在C语言上扩展出的语法,以帮助大家快速入门。函数竟然还有内联的形式?函数重载,重载的是什么?本篇文章都将会做讲解。
屿小夏
2024/01/22
3250
【c++入门】内联函数 和 函数重载 详解!
小朋友学C++(20):内联函数
第(2)种方法比第(1)种方法,有三个优点: ① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多 ② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多 ③ 函数可以重用,不必为其他应用程序重写代码 但也有一个缺点: 调用函数比求解等价表达式要慢得多。在大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置执行
海天一树
2018/07/25
4060
C++ 内联函数的相关概念
介绍内联函数之前,需要说明一下 C ++ 在执行普通函数时的一个过程,在调用普通函数时,执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳转到标记函数起点的内存单元,执行函数代码,然后调回到地址被保存的指令处,下图是关于 C ++ 普通函数调用的一个示意图:
wenzid
2021/03/04
6990
C++ 内联函数的相关概念
解析C++内联函数与auto关键字
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
Yui_
2024/10/16
960
解析C++内联函数与auto关键字
C++小白成长记:从基础到实战的详细入门教程
C++作为一种通用编程语言,自1980年代问世以来,凭借其强大的性能、灵活性以及对面向对象编程的支持,广泛应用于各种领域。从系统软件、游戏开发到嵌入式系统和高性能应用,C++无处不在。相比其他编程语言,C++不仅继承了C语言的底层操作能力,还提供了高层次的抽象和面向对象的设计思想,使其在复杂项目的开发中得以脱颖而出。
suye
2024/10/16
1430
快速从C过度C++(二):引用,内联函数,nullptr
📝前言: 本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C++过度,我们首先要掌握的一些基础知识,以便于我们快速进入C++的学习,为后面的学习打下基础。上一篇文章快速从C过度C++,我们讲述了namespace,C++的输入和输出,缺省参数,函数重载。 这篇文章主要介绍: 1,引用 2,内联函数 3,nullptr
用户11029137
2025/03/07
1080
【C++入门】内联函数inline
我们都知道一个函数的调用需要经历传参,创建栈帧,压栈,栈帧销毁等等过程。如果一个函数调用次数多而整体又相对比较简短,那么在频繁的调用中会影响程序整体的效率。那么如何解决这一问题?
薄荷冰
2024/01/22
1510
【C++入门】内联函数inline
【C语言】内联函数总结
inline关键字是C99标准的型关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。这样调用函数的过程就可以直接执行函数代码,而不发生跳转、压栈等一般性函数操作。可以节省时间,也会提高程序的执行速度。
嵌入式与Linux那些事
2024/02/26
4520
【C语言】内联函数总结
C++从入门到精通——内联函数
内联函数是一种优化手段,通过在编译时将函数调用替换为函数体本身的复制品,以减少函数调用的开销。它适用于函数体较小、调用频繁的情况。使用内联函数可以提高程序执行效率,但也会增加最终生成的代码大小。在C++中,可以使用inline关键字声明内联函数。然而,编译器对于是否真正内联一个函数有最终决定权,即使函数被声明为内联,编译器也可以选择不进行内联。
鲜于言悠
2024/04/02
5870
C++从入门到精通——内联函数
【C++】内联函数 ① ( 内联函数引入 | 内联函数语法 )
" 内联函数 " 是 C++ 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率 ;
韩曙亮
2023/10/15
2890
【C++】内联函数 ① ( 内联函数引入 | 内联函数语法 )
【C++】 C++入门—内联函数
程序在执行一个函数前需要做准备工作:要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理,将之前压入栈中的数据都出栈,然后接着执行函数调用位置以后的代码。
叫我龙翔
2024/02/02
1050
【C++】 C++入门—内联函数
C++_内联函数
内联函数的关键子inline、缺省函数的缺省参数等,在函数声明或实现中只能出现一次,一般建议出现在声明中,实现中只是对于函数进行实现,声明是对外的接口,更能体现封装性
用户10551528
2023/05/09
3370
【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值
内联函数是以inline修饰的函数,在调用其该函数的时候会直接在调用处展开并不会开辟函数的栈帧空间所以非常适用在一下短小函数上面:
鸽芷咕
2024/05/25
1200
【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值
【c++入门】引用,内联函数,auto
引用是一个重要的概念,它提供了一种方式,通过它可以让两个不同的标识符(变量名、参数名等)引用同一个数据对象
用户11029103
2024/03/24
1560
【c++入门】引用,内联函数,auto
C++之内联函数
函数调用要开辟栈帧,如果是一些稍微复杂的递归问题或者排序问题(含有交换比较多,例如快排)就会导致开辟的函数栈帧的数量太多了,那么有没有什么办法可以优化一下这个函数栈帧呢?
摘星
2023/04/28
6500
C++之内联函数
【C++入门】内联函数、auto与基于范围的for循环
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
大耳朵土土垚
2024/04/15
2110
【C++入门】内联函数、auto与基于范围的for循环
推荐阅读
相关推荐
C语言内联函数,提升C技巧必备
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验