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

05-内联函数

写在前面

接下来又要学一个关键字了--inline
使用inline修饰函数的声明或者实现,可以使其变成内联函数
建议声明和实现都增加inline修饰
复制代码

名词解释

特点:
编译器会将函数调用直接展开为函数体代码 
可以减少函数调用的开销 
会增大代码体积
内联函数和普通函数的区别在于:当编译器处理调用内联函数的语句时,
不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处,(这尼玛又逼着我学汇编,还好大学时学过?)
就像整个函数体在调用处被重写了一遍一样
复制代码

码上封口

将main.m 改为mian.mm 文件
#include <iostream>
using namespace std;

//声明内联函数
inline int sum(int a, int b);

int main() {
    
    cout << "sum的和是:"<< sum(10, 20) << endl;
}

//内联函数的实现
inline int sum(int a, int b) {
    return a + b;
}
复制代码

码来补充

◼ 内联函数和宏,都可以减少函数调用的开销 
◼ 对比宏,内联函数多了语法检测和函数特性
◼ 思考以下代码的区别 #define sum(x) (x + x)
inline int sum(int x) { return x + x; } 
int a = 10; sum(a++);
复制代码

装逼一下

函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,
接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中,
最后才跳转到函数内部执行。这个过程是要耗费时间的。

另外,函数执行 return 语句返回时,需要从栈中回收形参和局部变量占用的存储空间
,然后从栈中取出返回地址,再跳转到该地址继续执行,这个过程也要耗费时间。


一般情况下,这个开销可以忽略不计。但是,如果一个函数内部没有几条语句,执行时间本来就非常短,
那么这个函数调用产生的额外开销和函数本身执行的时间相比,就显得不能忽略了。假如这样的函数在一个循环中被上千万次地执行,
函数调用导致的时间开销可能就会使得程序运行明显变慢。

作为特别注重程序执行效率,适合编写底层系统软件的高级程序设计语言
,C++ 用 inline 关键字较好地解决了函数调用开销的问题。
复制代码

完整代码demo,请移步GitHub:DDGLearningCpp

当然C++大神就绕吧,非喜勿喷,毕竟这是个人的学习笔记?

相关文章:

  • CF每日一练(2.8)
  • 研究人员发现 macOS 可获取用户密码的 0day 漏洞
  • vue3.0 记录01
  • Fedora logo 改版最新进展:已有三个候选方案
  • 前端设计模式
  • 区块链将重新定义世界
  • 时间复杂度与空间复杂度分析
  • 面试必备指南:你的系统如何支撑高并发?
  • [学习笔记]虚树
  • Iterator 和 for...of 循环
  • SharePoint:如何使用PowerShell批量删除名称以XXX开始的List?
  • Kafka之与Spring集成
  • python 模块一览
  • 《流浪地球》:一个程序员用代码拯救了世界,真硬核!
  • 500位软件开发工程师的声音:微服务和CI/CD依旧是最爱
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [笔记] php常见简单功能及函数
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • ➹使用webpack配置多页面应用(MPA)
  • 230. Kth Smallest Element in a BST
  • Angular6错误 Service: No provider for Renderer2
  • Docker入门(二) - Dockerfile
  • echarts花样作死的坑
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • es6要点
  • java取消线程实例
  • Java深入 - 深入理解Java集合
  • linux学习笔记
  • MySQL QA
  • nginx 配置多 域名 + 多 https
  • PHP面试之三:MySQL数据库
  • 分布式事物理论与实践
  • 基于遗传算法的优化问题求解
  • 实现菜单下拉伸展折叠效果demo
  • 网页视频流m3u8/ts视频下载
  • 用element的upload组件实现多图片上传和压缩
  • 你对linux中grep命令知道多少?
  • Android开发者必备:推荐一款助力开发的开源APP
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • Spring第一个helloWorld
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 国内开源镜像站点
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何在招聘中考核.NET架构师
  • ​2020 年大前端技术趋势解读
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • (003)SlickEdit Unity的补全
  • (4)(4.6) Triducer
  • (C#)获取字符编码的类
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (一)python发送HTTP 请求的两种方式(get和post )