C++新经典09--函数新特性、inline内联函数与const详解
函数回顾与后置返回类型
函数定义中如果有形参则形参应该有名字,而不光是只有类型,但是如果并不想使用这个形参,换句话说这个形参并不在这个函数中使用,则不给形参名也可以,但在调用这个函数的时候,该位置的实参是必须要明确给出的。
看看如下范例,函数定义中的第二个形参只给出了类型,并没有给出名字:

但是,在进行函数声明的时候,是可以没有形参名的。虽然写形参名会帮助自己和其他读代码的人更好地理解代码,但是编译器会忽略形参名。看如下函数声明的代码:

上面这种写法叫作“前置返回类型”,也就是说函数的返回类型位于函数声明或者函数定义语句的开头。
在C++11中还引入了一种新的语法,叫后置返回类型,也就是在函数声明或定义中把返回类型写在参数列表之后,对于有一些返回类型比较复杂的情形,这种写法可能更容易让人看懂,同时,有一些比较特殊的场合,还必须采用这种语法来书写,后面会讲解到。请读者先知道有这样的写法即可,当前不需要深究其他。看看如下范例:
auto func(int,int) -> int; //函数声明中的后置返回类型写法
auto func(int a,int b) -> int //函数定义中的后置返回类型写法
{return 1;
}
总结一下“后置返回类型”的写法:前面放置auto关键字,表示函数返回类型放到参数列表之后,而放在参数列表之后的返回类型是通过“->”开始的。此外,补充一点函数书写时的说明:一个函数内包含的代码不要太长,不同的功能尽量分解到多个函数中去写,一般一个函数内(函数体)建议包含几十到上百行代码,尽量不要书写上千行代码,函数体太过冗长也增加了他人阅读这段代码的理解难度和时间。
inline内联函数
先看一个范例:
inline int myfunc(int testv) //函数定义,这里必须加inline
{return testv * (5 + 4) * testv;
}
注意上面这段代码,在该函数定义之前增加了一个inline关键字,增加了这个关键字的函数,叫作内联函数。那么,inline有什么作用呢?
每个人都知道,调用函数是要消耗系统资源的,尤其是一些函数体很小但却频繁调用的函数,调用起来很不划算,因为要频繁地进行压栈、出栈动作以处理函数调用和返回的问题,这也意味着要频繁地为它们开辟内存。为了解决这种函数体很小、调用又很频繁的函数所耗费的系统性能问题,引入了inline关键字。该关键字的效果如下:
(1)影响编译器,在编译阶段完成对inline函数的处理,系统尝试将调用该函数的动作替换为函数的本体(不再进行函数调用)。通过这种方式,来提升程序执行性能。
(2)inline关键字只是程序员(开发者)对编译器的一个建议,编译器可以尝试去做,也可以不去做,这取决于编译器的诊断功能,也就是说决定权在编译器,无法人为去控制。
(3)传统书写函数时一般将函数声明放在一个头文件中,将函数定义放在一个.cpp源文件中,如果要把函数定义放在头文件中,那么超过1个.cpp源文件要包含这个头文件,系统会报错,但是内联函数恰恰相反,内联函数的定义就放在头文件中,这样需要用到这个内联函数的.cpp源文件都能通过#include来包含这个内联函数的源代码,以便找到这个函数的本体(源代码)并尝试将对该函数的调用替换为函数体内的语句。
那么,使用内联函数的优缺点是什么呢?
用函数本体取代函数调用,显然可以增加效率。但同时带来的问题是函数代码膨胀了。所以内联函数函数体要尽可能短小,这样引入inline才有意义。请读者想一想,调用一个函数时需要压栈开辟内存等动作,假如这些动作需要花费1s的时间,如果在这个函数中代码的执行需要花费1000s的时间,那这个函数写成内联函数之后,也就节省了1s的时间,但是源文件代码却膨胀的很大。如果在多个地方调用这个函数,那就相当于多个地方出现代码的重复膨胀,代码在程序运行时也是要占用内存的,因为内存中有代码段专门保存程序代码。
请注意:
(1)编译器不同,可能内联的结果也不同,有些编译器很聪明,优化好了只剩下一个结果,有些编译器差了一点,优化成一些表达式,再差一点的编译器就真变成直接把函数体中的语句拿来替换到函数调用处了。
(2)inline函数尽量简单,代码尽量少,尤其是各种复杂的循环、分支、递归调用等,尽量少出现在内联函数中,否则,编译器可能会因为这些代码的原因拒绝让这个函数成为内联函数。
(3)前面讲解constexpr函数时,回忆一下给函数加constexpr的目的,就是因为要将该函数用在常量表达式中。当时曾经说过,这种constexpr函数,函数体必须要写的特别简单,如果写了某些多余的语句,那么编译就会出错,所以,可以把constexpr函数看成是更严格的一种内联函数,因为constexpr自带inline属性。
(4)内联函数有点像宏展开(#define),宏展开和内联函数有各种差别,如类型检查等。
相关文章:
C++新经典09--函数新特性、inline内联函数与const详解
函数回顾与后置返回类型 函数定义中如果有形参则形参应该有名字,而不光是只有类型,但是如果并不想使用这个形参,换句话说这个形参并不在这个函数中使用,则不给形参名也可以,但在调用这个函数的时候,该位置…...
C++中机器人应用程序的行为树(ROS2)
马库斯布赫霍尔茨 一、说明 以下文章为您提供了对机器人应用程序或框架中经常使用的行为树的一般直觉:ROS,Moveit和NAV2。了解行为 Tress (BT) 框架的原理为您提供了在游戏领域应用知识的绝佳机会。BT可以与Unity或Unreal集成。 由…...
像Vuex一样使用redux
redux基础知识 本篇文章主要介绍redux的基本使用方法,并简单封装,像vuex一样写redux 学习文档 英文文档: https://redux.js.org/ 中文文档: http://www.redux.org.cn/ Github: https://github.com/reactjs/redux redux是什么 redux和vuex几乎是一…...
关于模板的大致认识【C++】
文章目录 函数模板函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板的定义格式类模板的实例化 非类型模板参数typename 与class模板的特化函数模板特化类模板特化全特化偏特化 模板的分离编译 函数模板 函数模板的原理 template <typename T> //模板参数…...
C#如何遍历类的属性,并获取描述/注释
要获取属性的描述/注释,需要使用System.ComponentModel命名空间中的DescriptionAttribute。可以通过反射获取属性上的DescriptionAttribute,并获取其Description属性值。 首先,需要引入System.ComponentModel命名空间: using Sy…...
ffmpeg 子进程从内存读取文件、提取图片到内存
除了网络、文件io,由python或java或go或c等语言开启的ffmpeg子进程还支持pipe,可以从stdin读入数据,输出转化后的图像到stdout。无需编译 ffmpeg,直接调用 ffmpeg.exe不香么! “从内存读”可用于边下载边转码…...
Springboot+Netty+WebSocket搭建简单的消息通知
SpringbootNettyWebSocket搭建简单的消息通知 一、快速开始 1、添加依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.36.Final</version> </dependency> <dependency>…...
@RefreshScope静态变量注入
RefreshScope注解通常用于注入实例变量,而不是静态变量。由于静态变量与类直接关联,刷新操作无法直接影响它们。 如果你需要动态刷新静态变量的值,一种可行的方案是使用一个通过Value注解注入的实例变量,并在该实例变量的getter方…...
多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测
多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测。 模型描…...
SAP 凭证项目文本 增强 demo2
SAP 凭证项目文本 增强 demo2 增强点 AC_DOCUMENT METHOD if_ex_ac_document~change_initial. DATA: ls_item TYPE accit, ls_exitem TYPE accit_sub, lv_sgtxt TYPE bseg-sgtxt, lv_bktxt TYPE bkpf-bktxt, lv_zuonr TYPE bseg-zuonr, lv_blart TYPE bkpf-blart, lv_zprono TY…...
一套基于C#语言开发的LIMS实验室信息管理系统源码
实验室信息管理系统(LIMS)是指帮助实验室组织和管理实验数据的计算机软件系统,它将实验室操作有机地组织在一起,以满足实验室工作流程的所有要求。它能以不同的方式支持实验室的工作,从简单的过程(如样品采集和入库)到复杂的流程(…...
kubesphere部署rocketmq5.x,并对外暴露端口
kubesphere是青云开源的k8s管理工具,用户可以方便的通过页面进行k8s部署的部署,rocketmq则是阿里开源的一款mq平台,现在版本为5.1.3版本,较比4.x版本的rocketmq有比较大的调整:比如客户端的轻量化(统一通过…...
5.8 汇编语言:汇编高效除法运算
通常情况下计算除法会使用div/idiv这两条指令,该指令分别用于计算无符号和有符号除法运算,但除法运算所需要耗费的时间非常多,大概需要比乘法运算多消耗10倍的CPU时钟,在Debug模式下,除法运算不会被优化,但…...
如何通过python来给手机发送一条短信?
要通过Python发送短信到手机,您可以使用不同的短信服务提供商的API。以下是一个使用Twilio和Sinch服务提供商的示例,您可以根据自己的选择来决定使用哪个。 使用Twilio发送短信: 首先,注册一个Twilio账户并获取您的账户SID、认证令牌和Twilio号码。 安装 twilio 包,如果您…...
无涯教程-PHP - IntlChar类
在PHP7中,添加了一个新的 IntlChar 类,该类试图公开其他ICU函数。此类定义了许多静态方法和常量,可用于操作unicode字符。使用此类之前,您需要先安装 Intl 扩展名。 <?phpprintf(%x, IntlChar::CODEPOINT_MAX);print (IntlCh…...
【Linux操作系统】Linux系统编程中信号捕捉的实现
在Linux系统编程中,信号是一种重要的机制,用于实现进程间通信和控制。当某个事件发生时,如用户按下CtrlC键,操作系统会向进程发送一个信号,进程可以捕获并相应地处理该信号。本篇博客将介绍信号的分类、捕获与处理方式…...
【PHP】基础语法变量常量
文章目录 PHP简介前置知识了解静态网站的特点动态网站特点 PHP基础语法代码标记注释语句分隔(结束)符变量变量的基本概念变量的使用变量命名规则预定义变量可变变量变量传值内存分区 常量基本概念常量定义形式命名规则使用形式系统常量魔术常量 PHP简介 PHP定义:一…...
Failed to resolve: com.github.mcxtzhang:SwipeDelMenuLayout:V1.3.0
在allprojects下的repositories闭包里面添加jcenter()和maven {url https://jitpack.io},具体可以看你的第三方框架需要添加什么仓库,大多数都只需要上面两个。 我的build.gradle(Project)完整内容如下: buildscript …...
常用 Python IDE 汇总(非常详细)从零基础入门到精通,看完这一篇就够了
写 Python 代码最好的方式莫过于使用集成开发环境(IDE)了。它们不仅能使你的工作更加简单、更具逻辑性,还能够提升编程体验和效率。 每个人都知道这一点。而问题在于,如何从众多选项中选择最好的 Python 开发环境。初级开发者往往…...
【Hive】HQL Map 『CRUD | 相关函数』
文章目录 1. Map 增删改查1.1 声明 Map 数据类型1.2 增1.3 删1.4 改1.5 查 2. Map 相关函数2.1 单个Map 3. Map 与 String3.1 Map 转 string3.2 string 转 Map 1. Map 增删改查 1.1 声明 Map 数据类型 语法:map<基本数据类型, 基本数据类型> 注意是<>…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
