当前位置: 首页 > news >正文

【C++】内联函数inline

文章目录

  • 概念
  • 使用
  • 特性
  • 原理


概念

C++中内联函数的出现解决了C语言宏函数的不足,类似于宏展开,这种在函数调用处直接嵌入函数体的函数称为内联函数,又称内嵌函数或内置函数。

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数可以提升程序运行的效率

使用

在函数的返回值前加上inline关键字即可。

#include<iostream>
using namespace std;
inline int Add(int x, int y)
{return x + y;
}
int main()
{int ret = Add(10,20);cout<<ret<<endl;return 0;
}

如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

特性

1)短小的,频繁调用的函数才适合声明为内联函数。要知道inline对于编译器而言只是一个建议,不是强制性的,编译器有自己的判断能力。

2)为什么函数体长了之后,内联函数不展开?

如果函数体代码比较长,如递归等,使用内联函数会导致代码膨胀。会导致编译后的程序存在多份相同的拷贝,编译出来的可执行程序也会非常大,会消耗更多的内存空间,如果指向函数体代码的时间比函数调用的开销大的多,那么inline效率收益会很小

3)所以inline是一种空间换时间的做法(空间:由于函数体代码展开,编译出来的可执行程序大小/静态库,动态库/会变大)

4)综上,内联函数的缺点:可能会使目标文件变大;优点:少了调用开销,提高程序运行效率

5)inline内联函数不建议声明和定义分离
在这里插入图片描述
在这里插入图片描述
错误定义:声明和定义分离如下:
在这里插入图片描述

解决方法:直接在头文件中定义内联函数

在这里插入图片描述

原理

我们通过查看程序代码的反汇编语言,来了解一下inline函数的执行原理:

查看方式:

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add
  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)

先右击项目,点击项目属性。
在这里插入图片描述
我们先来看一段普通函数f的调用过程(通过查看debug下的汇编代码):
在这里插入图片描述
内联函数的原理即底层调用方式:
在这里插入图片描述

http://www.lryc.cn/news/42427.html

相关文章:

  • C++演讲比赛流程管理系统_黑马
  • 谈谈低代码的安全问题,一文全给你解决喽
  • [数据结构]二叉树OJ(leetcode)
  • flutter 输入时插入分隔符
  • 静态版通讯录——“C”
  • 前端基础开发环境搭建工具等
  • 华为OD机试题【IPv4 地址转换成整数】用 Java 解 | 含解题说明
  • [数据结构]排序算法
  • 不愧是2023年就业最难的一年,还好有车企顶着~
  • C/C++之while(do-while)详细讲解
  • SpringCloud学习笔记(一)认识微服务
  • Unity中使用WebSocket (ws://)的方法
  • 米哈游春招算法岗-2023.03.19-第一题-交换字符-简单题
  • 能把爬虫讲的这么透彻的,没有20年功夫还真不行【0基础也能看懂】
  • springcloud学习总结
  • 2022年亏损超10亿,告别野蛮成长的众安在线急需新“引擎”
  • ChatGPT文心一言逻辑大比拼(一)
  • 【机器学习面试总结】————特征工程
  • 如何将字符串反转?
  • Linux内核IO基础知识与概念
  • paper文献和科研小工具
  • dfs和bfs能解决的问题
  • 静态通讯录,适合初学者的手把手一条龙讲解
  • 【你不知道的 CSS】你写的 CSS 太过冗余,以至于我对它下手了
  • Lesson 8.1 决策树的核心思想与建模流程
  • 【算法】FIFO先来先淘汰算法分析和编码实战
  • 二分查找——我欲修仙(功法篇)
  • Python 多线程
  • JVM笔记(九)选择合适的垃圾收集器
  • 二维图像处理到三维点云处理