C++ inline内联函数详解
函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。
如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。
为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。
指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。请看下面的例子:
#include <iostream>
using namespace std;//内联函数,交换两个数的值
inline void swap(int *a, int *b){int temp;temp = *a;*a = *b;*b = temp;
}int main(){int m, n;cin>>m>>n;cout<<m<<", "<<n<<endl;swap(&m, &n);cout<<m<<", "<<n<<endl;return 0;
}
运行结果:
42 85
85, 42
85, 42
注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。
当编译器遇到函数调用swap(&m, &n)时,会用 swap() 函数的代码替换swap(&m, &n),同时用实参代替形参。这样,程序第 16 行就被置换成:
int temp;
temp = *(&m);
*(&m) = *(&n);
*(&n) = temp;
编译器可能会将 (&m)、(&n) 分别优化为 m、n。
由于内联函数比较短小,我们通常的做法是省略函数原型,将整个函数定义(包括函数头和函数体)放在本应该提供函数原型的地方。
C++ inline内联函数详解相关推荐
- inline 内联函数详解 内联函数与宏定义的区别
一.在C&C++中 一.inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionName ...
- C++入门 “引用”,“内联函数” 详解
目录 一.引用 1.引用的概念: 2.引用的格式: 3.引用的特性 4.取别名原则: 难点:隐式类型转换的引用 5.引用的使用场景: [1]做参数: [2]做返回值 (1)int& Count ...
- C++ 内联函数详解(搞清内联的本质及用法)
目录 一.什么是内联函数 1.直观上定义: 2.更深入的思考: 二.为什么使用内联函数 1.为什么要代替部分宏定义 2.普通函数频繁调用的过程消耗栈空间 3.更深入的思考 三.内联函数和编译过程的相爱 ...
- c++:内联函数详解和普通函数的区别
文章目录 前言 Ⅰ.常规函数 Ⅱ.内联函数 1.语法 2.注意 Ⅲ.选择地使用内联 思考? 前言 内联函数是c++为了提高程序的运行速度做的改进,它与普通函数区别在于: 编译器如何将它们组合到程序中. ...
- VC++ inline内联函数的作用解决方案
VC++ inline内联函数的作用解决方案 __attribute__((always_inline)) attribute((always_inline))的意思是强制内联,所有加了attribu ...
- python3 内置函数详解
内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小. # 如果参数是复数,则返回其大小.>>> abs(-25) 25>> ...
- C++ inline内联函数
C++ inline内联函数 简介 声明内联函数 定义内联函数 总结 简介 函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码.CPU 在执行主调函数代码时如果遇到了被调函数,主调 ...
- c语言inline不起作用,C语言inline内联函数学习小结
//inline(内联)函数:将普通的函数定义为inline函数,可以避免普通函数入栈出栈的开销,它是将函数内的代码直接粘贴到调用处.除此之外,它和普通函数无异. //要成为inline函数必须具备以 ...
- inline内联函数
inline 内联函数和普通函数的区别: 1.inline内联函数:在编译过程中,就没有函数的调用开销了,在函数的调用点直接把函数的代码进行展开处理 2.inline 函数不再生成相应的函数符号 in ...
最新文章
- EIGRP注入默认路由
- 零基础入门CV赛事,理论结合实践
- 基于黄色LED反向电流的光电检测板
- C++实现平衡二叉树
- SpringMVC 课纲
- Xshell选中的同时把内容复制到剪贴板(还可以设置设置文本分隔符)
- vxworks操作系统_【7.10开播】最新自主研发工业操作系统发布会行业top来助阵,邀您共同见证(附报名)...
- 和我一起学 Selenium WebDriver
- Selenium WebDriver- 使用Frame中的HTML源码内容操作Frame
- javafx 推箱子小游戏object类_突破LeetCode Hard模式之《推箱子》
- AutoJs4.1.0实战教程---终极福利Apk
- 大漠插件:找图位置偏移(超出界面边界)
- 计算机控制理论及应用,计算机控制理论及应用.doc
- 熵增定律:企业和个人发展的终极规律
- debian 7 调整控制台分辨率
- DNS劫持原理,DNS劫持如何解决?
- 线性代数笔记——第一章行列式
- nova shelve 的使用
- 【宇麦科技】群晖NAS套件之Drive的安装与使用(一),保姆级教程来喽!
- ajax查询全国天气预报,使用聚合数据api接口
热门文章
- python逐行打印_python中逐行打印
- 如何获取图像的驱动_Adobe Camera Raw 12 Mac(Raw格式图像ps插件) v12.2.1.417
- 线程中如何使用对象_在 Flink 算子中使用多线程如何保证不丢数据?
- 中关村Win11 32位微软原版ISO V2021.08
- win7电脑浏览器证书过期的解决方法
- 多路RTSP-RTMP转RTMP定制版
- Shiro之UsernamePasswordTokenRememberMeAuthenticationTokenAuthenticationToken
- springboot-项目获取resources下文件的方法
- Spring中@Autowired和@Resource的区别
- 解决MongoDB Compass