【C++】内联函数一看就懂?

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 一、引入:
- 二、内联函数概念
- 三、修改属性
- 四、实例
- 五、内联函数的优缺点
- 1.优点:
- 2.缺点:
- 五、内联函数的使用细则
一、引入:
我们在C语言学习中学习了宏的相关知识,宏的定义:#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义。通过宏定义的函数,在编译时,自动替换的函数调用位置,不会进行压栈等操作,可以提升效率,但是他的缺点也很明显,就是宏不支持调试的,也没有类型安全的检查,而且语法复杂。所以我们引进了内联函数。
二、内联函数概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
三、修改属性
- 在
release模式下,查看编译器生成的汇编代码中是否存在callAdd - 在
debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不
会对代码进行优化,以下给出vs2019的设置方式
第一步:右击你创建的项目并点击属性

第二步::点击常规–调式信息格式–修改为程序数据库

第三步:点击优化–内联函数扩展–只适用于inline(/Ob1)

四、实例
看一下代码:
定义了两个函数非内联函数Add1和内联函数Add2。
int Add1(int left, int right)
{int ret1 = left + right;return ret1;
}inline int Add2(int x, int y)
{int ret2 = x + y;return ret2;
}int main()
{//非内联int recive1 = Add1(4, 5);//内联int recive2 = Add2(5, 7);return 0;
}
通过返汇编可以清楚的看到,内联函数的调用没有,push压栈等操作。

绿色方框内是非内联函数调用:可以发现使用了push call操作。
蓝色方框是内联函数:直接mov移动过来,全程没有压栈,出栈操作。
五、内联函数的优缺点
1.优点:
- 不需要建立函数栈帧。
- 可读性强,且不易出错。
- 可以调试
- 使用起来简单。
2.缺点:
内联不是万能的,它以代码膨胀(拷贝)为代价,仅仅省区了函数调用的开销,从而提高程序的执行效率。(开销指的是参数的压栈、跳转、退栈和返回操作)。
五、内联函数的使用细则
(1)如果执行函数体内代码的时间比函数调用的开销大得多,那么inline效率收益会很小。
(2)每一处内联函数的调用都要拷贝代码,使程序的总代码量增大,消耗更多的内存空间。
(3)以下情况不宜使用内联:
- 如果函数体内代码比较长,使用内联将导致可执行代码膨胀过大。
- 如果函数体内出现循环或者其他复杂的控制结构,那么执行函数体内代码的时间将比函数调用的开销大得多。
总之:一般只将那些短小的、频繁调用的函数声明才使用内联函数。
相关文章:
【C++】内联函数一看就懂?
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
非洲“支付宝”PalmPay搭载OceanBase:成本降低80%
10 月 30 日,非洲支付公司PalmPay 的核心系统搭载国产自研数据库OceanBase,正式投入使用。PalmPay 也是 OceanBase 首个非洲商业用户。 作为一家非洲领先的金融科技公司,PalmPay 于 2019 年在尼日利亚推出电子钱包应用,其功能类似…...
EASYX图片操作
easyx学习网址 建议使用谷歌搜索引擎搜索相关的资料 eg1:图片显示到桌面 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3…...
多测师肖sir_高级金牌讲师__adb命令
adb指令整理: ADB常用的指令: 查看当前连接设备 : adb devices 进入到shell : adb shell 查看日志 : adb logcat 安装apk文件 : adb install xxx.apk 卸载APP : adb uninstall 包名 查看包名 &…...
块级作用域的理解
块级作用于的概念 由一对花括号{}中的语句集都属于一个块,在这个{}里面包含的块内定义的所有变量在代码块外都是不可见的,因此称为块级作用域。 作用域永远都是任何一门语言的重中之中,因为它控制着变量和参数的可见性和生命周期。讲到这里&…...
【GitLab、GitLab Runner、Docker】GitLab CI/CD 应用
安装Gitlab开源版 官方文档-安装Gitlab 使用Docker安装 sudo docker run --detach \--hostname gitlab.example.com \--env GITLAB_OMNIBUS_CONFIG"external_url http://${ip}:9999/; gitlab_rails[gitlab_shell_ssh_port] 8822;" \--publish 443:443 --publish 99…...
Linux文本编辑器vim使用和配置详解
vim介绍 vim是Linux的一款文本编辑器,可以用来编辑代码,而且支持语法高亮,还可以进行一系列配置使vim更多样化。也可以运行于windows,mac os上。 vim有多种模式,但目前我们只介绍绝大多数场景用的到的模式&…...
港科夜闻|香港科大戴希教授被选为腾讯公司新基石研究员
关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大戴希教授被选为腾讯公司“新基石研究员”。10月30日,作为目前国内社会力量资助基础研究力度最大的公益项目之一,“新基石研究员项目”揭晓了第二期获资助名单,来自13个城市28家…...
如何读懂深度学习python项目,以`Multi-label learning from single positive label`为例
Paper : Multi-label learning from single positive label Code 先读一读README.md 可能有意想不到的收获; 实验环境设置要仔细看哦! 读论文 如何读论文,Readpaper经典十问 (可能在我博客里有写) How to read a …...
【面试】Kafka基础知识
定义 Kafka是一个分布式基于发布/订阅模式的消息队列 优点 解耦:上下游之间依赖解耦。缓冲/削峰:生产消息的速度和消费消息的速度不一致时,可以起到缓冲作用。异步:天然的异步处理机制,生产者把消息(任务)放进队列&…...
【入门Flink】- 06Flink作业提交流程【待完善】
Standalone 会话模式作业提交流程 代码生成任务的过程: 逻辑流图(StreamGraph)→ 作业图(JobGraph)→ 执行图(ExecutionGraph)→物理图(Physical Graph)。 作业图算子链…...
Linux 上的轻量级浏览器
导读大多数 Linux 桌面环境中包含的基本图像查看器可能不足以满足你的需要。如果你想要一些更多的功能,但仍然希望它是轻量级的,那么看看这四个 Linux 桌面中的图像查看器,如果还不能满足你的需要,还有额外的选择。 当你需要的不…...
肆[4],滤波
1,简介 1.1,Opencv提供滤波处理函数 方框滤波,BoxBlur函数 均值滤波(领域平均滤波),Blur函数 高斯滤波,GaussianBlur函数 中值滤波,medianBlur函数 双边滤波,bilateralFilter函数 1.2&…...
Python 包管理器入门指南
什么是 PIP? PIP 是 Python 包管理器,用于管理 Python 包或模块。注意:如果您的 Python 版本是 3.4 或更高,PIP 已经默认安装了。 什么是包? 一个包包含了一个模块所需的所有文件。模块是您可以包含在项目中的 Pyth…...
2022年06月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 如下所示的2行代码,最后print()函数打印出来的结果是?( ) c [[赵大,…...
配置Raspberry自动连接WIFI,在无法查看路由器的校园网情况下使用自己电脑热点
1、开启电脑热点,并共享电脑WLAN2 打开控制面板->网络和Internet->网络连接 选择自己的校园网,我这里是WLAN2,右键属性,如下操作: 如果没有看到 本地连接*10类似的图标 则按如下操作:winx键&#x…...
#stm32整理(一)flash读写
以这篇未开始我将进行stm32学习整理为期一个月左右完成stm32知识学习整理内容顺序没有一定之规写到哪想到哪想到哪写到哪,主要是扫除自己知识上的盲区完成一些基本外设操作。 以stm32f07为例子进行flash读写操作 stm32flash简介 参考资料正点原子和野火开发手册 …...
windows10编译高版本openssl
参考文章 参考文章中的windows编译为低版本,在高版本的openssl编译中已经没有:“ms\do_ms.bat”这个脚本了,现记录下编译过程 1、准备工作 安装ActivePerl,安装后会自动写入环境变量,参照参考文章测试安装成功与否&a…...
Mac之NVM|通过brew安装、更新、卸载、重新安装nvm
文章目录 导文通过brew安装NVM通过brew更新NVM通过brew卸载NVM通过brew重新安装NVM 导文 Mac之NVM 通过brew安装、更新、卸载、重新安装 通过brew安装NVM brew install nvm通过brew更新NVM brew upgrade nvm通过brew卸载NVM brew uninstall nvm通过brew重新安装NVM brew re…...
react的状态管理有哪些方法?
在React中,有多种方法可以进行状态管理,以下是其中一些常见的方法: 1:使用React的内置状态(State): React组件可以通过使用 useState 钩子来管理内部的状态。它允许你在函数组件中定义和更新状态。例如: import React, { useState } from react;function MyComponent…...
从内核事件到业务洞察:手把手教你用sysdig + Lua脚本定制专属监控看板
从内核事件到业务洞察:用sysdig与Lua脚本构建定制化监控体系 当你的微服务集群每天处理数十亿次API调用时,标准监控指标如CPU使用率或内存消耗早已无法满足需求。真正的挑战在于:当某个关键业务接口的99线突然飙升时,如何快速定位…...
Arduino_ConnectionHandler库:嵌入式网络连接状态管理与自适应重连
1. Arduino_ConnectionHandler 库深度解析:嵌入式网络连接管理的工程实践指南1.1 库定位与核心价值Arduino_ConnectionHandler是 Arduino 官方生态中面向物联网终端设备的网络连接抽象管理层,其设计目标并非替代底层通信协议栈(如 WiFiClient…...
终极指南:如何用buger/jsonparser实现10倍性能的Go JSON解析
终极指南:如何用buger/jsonparser实现10倍性能的Go JSON解析 【免费下载链接】jsonparser One of the fastest alternative JSON parser for Go that does not require schema 项目地址: https://gitcode.com/gh_mirrors/js/jsonparser buger/jsonparser是Go…...
用Python+Simulink复现数维杯A题:手把手教你搭建车辆主动减振模型(附代码)
PythonSimulink实战:从零构建车辆主动减振系统 1. 理解车辆振动控制的核心问题 车辆振动问题一直是工程领域的重要挑战。想象一下,当你驾驶一辆重型卡车经过颠簸路面时,那种令人不适的震动不仅影响驾驶体验,长期来看还会对车辆结构…...
突破B站缓存限制:m4s-converter视频格式转换完全指南
突破B站缓存限制:m4s-converter视频格式转换完全指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当旅行途中想离线观看缓存视频却…...
Modelsim与Vivado仿真差异:从阻塞赋值到存储IP的深度解析
1. 当仿真结果“精神分裂”:一次真实的噩梦Debug之旅 昨天我经历了一场堪称“硬件工程师噩梦”的Debug。我和队友完成了一个LeNet神经网络推理的硬件实现,在Modelsim里跑得顺风顺水,功能验证完美通过。但当我们信心满满地准备移植到Vivado平台…...
如何选择高转化率的关键词_如何优化SEO关键词
<h2>如何选择高转化率的关键词</h2> <p>在现代数字营销中,选择高转化率的关键词是提升网站流量和销售额的关键。一个成功的SEO策略,需要在关键词选择上下足功夫,因为这直接影响到网站的整体效果。本文将从问题分析、原因说…...
告别编码等待:LosslessCut的无损视频处理革命
告别编码等待:LosslessCut的无损视频处理革命 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 副标题:掌握零质量损失剪辑、多轨道精细控制与批…...
Stable Diffusion v1.5 Archive 镜像实测:5步完成部署,快速体验文生图
Stable Diffusion v1.5 Archive 镜像实测:5步完成部署,快速体验文生图 1. 开篇:为什么选择SD1.5 Archive版本 Stable Diffusion作为当前最热门的开源AI绘画模型,已经迭代了多个版本。其中v1.5作为经典版本,在图像质量…...
LumiPixel Canvas Quest人像生成中的数据结构优化实践
LumiPixel Canvas Quest人像生成中的数据结构优化实践 1. 为什么需要优化数据结构 当你用LumiPixel Canvas Quest处理大批量人像时,有没有遇到过程序变慢甚至崩溃的情况?这通常是因为图像数据在内存中的组织方式不够高效。就像整理衣柜一样,…...
