【C++】inline 内联函数

news2024/10/3 10:42:08

文章目录

  • 📕 概念
  • 📕 使用前的准备
  • 📕 使用
  • 📕 特性

📕 概念

在 C++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。

但是,当我们使用 inline 修饰一个函数的时候,在调用该函数的地方,编译器就有可能会直接将函数在那里展开,而不是 call 这个函数。
为什么这里说 “有可能” 呢?这是因为,inline 只是相当于给编译器一个 “建议” ,最终是直接展开,还是使用函数调用,是由编译器自己来决定的。

📕 使用前的准备

在 debug 模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不
会对代码进行优化,下面是对 VS2019 进行设置的方法)。

首先,点击最上方菜单栏的 “项目” ,然后在跳出的菜单栏中点击最下方的 “属性”。
其次,进行下面两张图片的设置。修改红色方框的内容,改成图中所示。

请添加图片描述
请添加图片描述

📕 使用

#include<iostream>
using namespace std;

int Add(int x, int y)
{
	int ret = x + y;
	return ret;
}

inline int Min(int x, int y)
{
	int ret = x - y;
	return ret;
}

int main()
{
	Add(10, 15);
	Min(10, 15);
	return 0;
}

如上是测试代码,按下 F10,进入调试状态,然后转到反汇编,查看汇编代码。下图中可以明显看出来,内联函数 Min 是直接展开的,而 Add 是调用函数。

在这里插入图片描述

📕 特性

  • inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
    用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
    行效率
  • inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
    议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
  • inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

关于上方的最后一点,是建议直接将 inline 函数的定义直接放在头文件里面,而不是声明和定义分离。如下,内联函数没有申明,而是直接定义。
请添加图片描述

如下图,如果将声明和定义分离,编译的时候就会报错。
首先看左边箭头所指处,可以看出是 Min() 函数出错,错误是无法解析。
其次看右边箭头所指的地方,发现出错的文件是 obj 类型,可以知道是链接的时候出错。

再根据程序翻译的过程这个预备知识,其实是合并符号表和重定位的过程出错,为什么?因为 内联函数在文件预处理阶段就已经展开,并不并入到符号表中去,编辑器没有给函数开辟空间,所以内联函数是没有地址的。在函数调用时,即使函数声明展开也是无法找到函数的。

在这里插入图片描述

以上就是对 inline 内联函数的简单介绍,以及它的一些特性,在编写一些行数较少的函数时,就可以考虑使用内联函数,但是不要忘了,内联函数不能声明和定义分离!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你需要同款“Unreal项目自动化编译、打包和部署”方案吗?

在过往几期的UWA Pipeline最佳实践案例中&#xff0c;我们分享了如何通过Pipeline实现性能优化、性能管理、游戏内容验收和云真机系统的应用&#xff08;实现批量真机设备的自动化测试&#xff0c;以及针对特效性能优化的方式&#xff09;&#xff0c;其实这些高效的方法并不局…

改进 YOLO V5 的密集行人检测算法研究(论文研读)——目标检测

改进 YOLO V5 的密集行人检测算法研究&#xff08;2021.08&#xff09;摘 要&#xff1a;1 YOLO V52 SENet 通道注意力机制3 改进的 YOLO V5 模型3.1 训练数据处理改进3.2 YOLO V5 网络改进3.3 损失函数改进3.3.1 使用 CIoU3.3.2 非极大值抑制改进4 研究方案与结果分析4.1 实验…

碰撞高校智慧,凝聚青春力量 | 因“AI”而“深”-高校开源专场顺利举办!

为聚焦AI新发展&#xff0c;探寻开源新环境&#xff0c;聆听高校声音&#xff0c;2月25日上午&#xff0c;第四届OpenI/O启智开发者大会以“因AI而深”为主题在深圳人才研修院举办高校开源专场&#xff0c;共同交流高校优质开源项目的发展经验、社区优秀开发者的心路历程及高校…

ROS2功能包Hello world(python)

文章目录环境准备Python创建工作空间、功能包及节点方法编译使用环境准备 为了便于日后复现&#xff0c;相关环境已经打包到docker中。 拉取docker镜像 docker pull 1224425503/ros2_foxy_full:latest新建容器 docker run -dit --rm --privilegedtrue --network host -e NV…

cnpm adduser 报错 409 Conflict

今天遇到一个问题&#xff0c;cnpm adduser 一直失败&#xff0c;返回 409 Conflict。 我们先来看下报错信息 409 Conflict - PUT http://registry.cnpm.xxxx.com.cn/-/user/org.couchdb.user:mingyu6 - conflict第一步 分析 http 错误码 409 Conflict&#xff1a;请求与服务…

Java函数式编程

从JDK8开始java支持函数式编程&#xff0c;函数式编程是面向数学的抽象&#xff0c;将计算描述为一种表达式求值&#xff0c;函数式程序就是一个表达式。JDK也提供了几个常用的函数式接口。 java的函数式编程还没有例如js那样的规范和深奥&#xff0c; 在函数式编程中&#xf…

蓝桥杯每日一题:不同路径数(dfs深度优先)

给定一个 nm的二维矩阵&#xff0c;其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发&#xff0c;每次可以沿上下左右四个方向前进一步&#xff0c;走过的位置可以重复走。 走了 k 次后&#xff0c;经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…

浅谈功能测试和性能测试的区别

刚刚入门软件测试的宝子&#xff0c;可能经常会看到&#xff1a;功能测试、性能测试&#xff0c;这些到底是什么呀&#xff1f;那我就带大家了解一下~ 一、定义 功能测试 功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0…

操作指南:如何高效使用Facebook Messenger销售(二)

上一篇文章我们介绍了使用Facebook Messenger作为销售渠道的定义、好处及注意事项&#xff0c;本节我们将详细介绍怎么将Facebook Messenger销售与SaleSmartly&#xff08;ss客服&#xff09;结合&#xff0c;实现一站式管理多主页配图来源&#xff1a;SaleSmartly&#xff08;…

喀秋莎Camtasia2023最新版本电脑录屏剪辑软件

录屏软件的鼻祖是techSmith 的喀秋莎&#xff08;Techsmith Camtasia Studio&#xff09;&#xff0c;视频编辑软件Camtasia 2023发布&#xff0c;十大新功能放出!作为一个自媒体人&#xff0c;每天都要录制编辑视频&#xff0c;选择一个好的视频编辑工具就是大家首先面临的一个…

招投标管理系统-适合于招标代理、政府采购、企业采购、工程交易等业务的企业

招投标管理系统-适合于招标代理、政府采购、企业采购、工程交易等业务的企业 招投标管理系统是一个用于内部业务项目管理的应用平台。以项目为主线&#xff0c;从项目立项&#xff0c;资格预审&#xff0c;标书编制审核&#xff0c;招标公告&#xff0c;项目开标&#xff0c;项…

Android Kotlin实战之高阶使用泛型扩展协程懒加载详解

前言&#xff1a; 通过前面几篇文章&#xff0c;我们已基本掌握kotlin的基本写法与使用&#xff0c;但是在开发过程中&#xff0c;以及一些开源的API还是会出现大家模式的高阶玩法以及问题&#xff0c;如何避免&#xff0c;接下来讲解针对原来的文章进行一些扩展&#xff0c;解…

【10K功能测试】-【20K自动化测试】之间的区别

前言 按测试执行的类型来分&#xff1a;功能测试、自动化测试 1&#xff0e;功能测试 功能测试俗称点点点测试。初级测试人员的主要测试任务就是执行测试工程师所写的测试用 例&#xff0c;记录用例的执行状态及bug情况。与开发人员进行交互直到bug被修复。 功能测试理论上是…

顺丰同城测试开发一面 49min答案,全文7000字,面试总结都在这里了

今天给大家分享一份顺丰同城的测试开发一面面试真题。老规矩&#xff0c;当你看到这份面试题的时候&#xff0c;先不要着急去看答案&#xff0c;你可以想想假如你在面试现场&#xff0c;你会怎么回答&#xff1f;这个思考的过程其实也是很重要的。 全文7000字干货&#xff0c;…

ADC0832的AD模数转换原理及编程

✅作者简介&#xff1a;嵌入式领域优质创作者&#xff0c;博客专家 ✨个人主页&#xff1a;咸鱼弟 &#x1f525;系列专栏&#xff1a;单片机设计专栏 &#x1f4c3;推荐一款求职面试、刷题神器&#x1f449;注册免费刷题 目录 一、描述 二、模数转换原理&#xff1a; 三、…

Gorm -- 添加记录

文章目录添加单条记录直接添加模型对象赋予默认值方法一&#xff1a; gorm 标签赋予默认值方法二&#xff1a; 设置钩子方法&#xff08;Hooks&#xff09;指定字段插入插入时忽略某些字段插入时禁止使用钩子方法添加多条记录通过对象列表插入通过字典列表插入在字典中使用SQL内…

【Linux】工具(3)——gcc/g++

咱们继续进阶&#xff0c;接下来进入到Linux工具中gcc和g的学习在本章博客正式开始介绍之前&#xff0c;我们先要弄清楚程序是怎么翻译的&#xff1a;C语言程序环境一、什么是gcc/g&#x1f4cc;gcc是一个c编译器&#xff0c; g是c编译器。我们根据代码的后缀名来判断用哪个编译…

NCRE计算机等级考试Python真题(十)

第十套试题1、数据库系统的核心是___________。A.数据库管理系统B.数据模型C.软件工具D.数据库正确答案&#xff1a; A2、下列叙述中正确的是___________。A.线性表链式存储结构的存储空间可以是连续的&#xff0c;也可以是不连续的B.线性表链式存储结构与顺序存储结构的存储空…

Stable Diffusion原理详解

Stable Diffusion原理详解 最近AI图像生成异常火爆&#xff0c;听说鹅厂都开始用AI图像生成做前期设定了&#xff0c;小厂更是直接用AI替代了原画师的岗位。这一张张丰富细腻、风格各异、以假乱真的AI生成图像&#xff0c;背后离不开Stable Diffusion算法。 Stable Diffusion…

大容量存储(涉及到的硬盘存取的原理)

磁盘的结构 我们简单分析一下&#xff0c;这里是计组的知识&#xff0c;大家可以自己多看些资料 柱面是基本单位 我们可以看到内圈的空间比外圈的要小&#xff0c;但是我们的每个磁道里的扇区是一样的&#xff0c;所以外圈的数据密度分布比内圈要更分散一些&#xff0c;这样就…