C++之内联函数

2023-10-29

C++之内联函数

为什么要有内联函数

我们编写了一个小函数,它的功能是比较两个string形参的长度并返回长度较小的string的引用。

// 挑出两个string 对象中较短的那个,返回其引用
const string & shorterString(const string &s1, const string &s2)
{
	return s1.size() <= s2.size() ? s1 : s2;
}

把这种规模较小的操作定义成函数有很多好处,主要包括:

  • 阅读和理解shorterString函数的调用要比读懂等价的条件表达式容易得多。
  • 使用函数可以确保行为的统一,每次相关操作都能保证按照同样的方式进行。
  • 如果我们需要修改计算过程,显然修改函数要比先找到等价表达式所有出现的地方再逐一修改更容易。
  • 函数可以被其他应用重复利用,省去了重新编写的代价。

然而,使用shorterString函数也存在一个潜在的缺点:调用函数一般比求等价表达式的值要慢一些。
在大多数机器上,一次函数调用其实包含着一系列工作:

常规函数调用使程序跳到另一个地址(被调用的函数的地址),并在函数结束时返回。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。

这与阅读文章时停下来看脚注,并在阅读完脚注后返回到以前阅读的地方类似。

C++是如何处理的

内联函数是C++为提高程序运行速度所做的一项改进。

常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。

内联函数的编译代码与其他程序代码“内联”起来了。也就是说,编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。

语法

在shorterString函数的返回类型前面加上关键字inline,这样就可以将它声明成内联函数了:

// 内联版本:寻找两个string 对象中较短的那个
inline const string & shorterString(const string &s1, const string &s2)
{
	return s1.size() <= s2.size() ? s1 : s2;
}

image-20230531220346297

注意

  • 内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。
  • 一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数。很多编译器都不支持内联递归函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之内联函数 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • SuperSocket框架介绍和示例

    SuperSocket框架适用于各种需要网络通信的应用场景 如游戏服务器 聊天系统 实时数据推送 物联网设备通信等 它可以帮助开发人员快速搭建出稳定 高效 安全的网络通信平台 SuperSocket框架是一款基于 NET平台的高性能 可扩展
  • java为什么要配置环境变量以及如何配置环境变量

    1 为什么要配置环境变量 1 首先解释一下什么是环境 环境就是你当前的操作系统 在这个操作系统中会有一些应用软件例如 goolg浏览器 qq 爱奇艺等等 这些软件都是依赖于当前的操作系统的 2 变量就是可以随意给其赋值的一个存储单元 而环境
  • JSP页面编码

    jsp中pageEncoding和Content Type中的charset pageEncoding 和jsp页面的显示没有关系 默认是iso8859 指本jsp页面的编码方式 如果jsp编辑时使用中文 则保存jsp时应使用utf 8 否
  • 字符识别模型训练与验证

    构建验证集 在机器学习与深度学习模型的训练过程中 模型非常容易出现过拟合的现象 构建验证集能够有效解决过拟合问题 验证集需要尽可能与测试集保持一致 在训练过程中不断验证模型在验证集上的精度 以此控制模型训练 验证集构建方法 1 留出法 Ho
  • 区块链开发之Solidity编程基础(四)合约事件

    事件 事件 智能合约返回值给用户接口 异步的带数据的触发器 一种比较便宜的存储 事件里的Indexed参数 事件 事件是以太坊虚拟机 EVM 日志基础设施提供的一个便利接口 用于获取当前发生的事件 事件和日志有三个用途 智能合约返回值给用户
  • Vision Transformers for Dense Prediction 论文阅读

    研一小菜鸡一枚 刚刚入门CV领域 最近对大火的Transformer 比较感兴趣 把刚刚阅读过的一篇论文和大家分享一下 第一次写文章 如有错误 还请指正 先放一下论文链接 https arxiv org pdf 2103 13413v1 p
  • 客户端读写HBase数据库的运行原理

    1 HBase的特点 HBase是一个数据库 与RDMS相比 有以下特点 它不支持SQL 不支持事务 没有表关系 不支持JOIN 有列族 列族下可以有上百个列 单元格 即列值 可以存储多个版本的值 每个版本都有对应时间戳 行键按照字典序升序
  • python 超时处理方法介绍,Eventlet 和 func-timeout

    前言 python 超时处理方法介绍 Eventlet 和 func timeout 有一些场景 需要我们控制程序或者脚本的运行时间 自动化用例中的某一个步骤需要在规定时间内完成才算有效 使用线程池控制线程运行时 我们不希望每个线程运行时间
  • endnote初始化数据库支持_科研中ENDNOTE的使用

    2020 0804更 看到还是不少人收藏 有观众就有动力有内容哈 再更新下 增加点细节 希望能达到最终的目标是通过这篇文章能让大家在理解的基础上上手Endnote 最近博士毕业了 慢慢总结下近年来用过的生 奇 产 技 工 淫 具 巧 其中用
  • Latent dirichlet allocation note

    2 Latent Dirichlet Allocation Introduction LDA是给文本建模的一种方法 它属于生成模型 生成模型是指该模型可以随机生成可观测的数据 LDA可以随机生成一篇由N个主题组成文章 通过对文本的建模 我们
  • 关于win10系统提示无法连接网上邻居的解决方法(提示信息:0x80070035错误)

    错误提示 错误代码 0x80070035 找不到网络路径 这个错误提示实际上是Windows专业版本地策略设置的问题导致的 比较简单 解决办法 通过修改组策略的 按window R键输入gpedit msc 来启动本地组策略编辑器 步骤如下
  • mybatis之解析statement标签过程分析

    写在前面 在这篇文章中分析了解析mapper xml的
  • Altium Designer 消除Net has no driving source警告的方法

    在进行原理图编译的时候提示警告 Net has no driving source 如下图 解决方法 点击Place Directives No ERC 不进行电气规则检查 在有警告的相应引脚处放置一个No ERC即可 然后从新编译就没有警
  • 第三方支付由直连模式进入网联模式

    不知不觉 中国已成为使用手机支付最多的国家 手机支付的两大的厂商 支付宝和微信支付 已经走进了千家万户 现在出门基本上手机能解决的基本上不用现金 人们已经习惯了不带现金的日子了 支付宝 在去年 支付宝与微信先后发布了提现需要收取0 1 的手
  • 研究阶段性总结

    写这一篇只是对自己之前做的东西做个简短的总结以及为接下来的发展做个规划 自己目前的研究领域为基于深度学习的自然语言处理 研一上学期主要是学习了自然语言处理的基础以及python语言 包括分词 词性标注 构建词典 基本算法原理python实现
  • unity3d 给模型添加刚体后、或者角色控制器后下坠

    1 给模型添加一个刚体后 还要给模型添加一个碰撞器 人和地面的话 要注意地面有没有碰撞器 有的话注意地面碰撞器的Mesh网格是不是Null 还有
  • javaScript和jQuery自动加载方法

    一 JavaScript自动加载 在文本中用onload 当页面中所有内容 包括图片 加载完后再执行onload 如下 在脚本中用window onload 当页面中的所有内容 包括图片 加载完后再执行window onload 如下 wi
  • frp服务器内网穿透设置

    内网穿透的作用 内网穿透是指在一个局域网内 也称内网 中 通过某种技术手段 将局域网内部的网络资源 如ssh服务 Web服务 数据库等 暴露到公网中 从而实现公网用户对内网资源的访问和控制 它可以使得外部用户能够访问局域网内部的设备和服务
  • ubuntu20.04安装Android Studio踩坑

    1 卸载搜狗输入法 截止现在 2020年10月7日 当搜狗输入法处于活动状态时 所有jetbrains全家桶都不能用 换用百度输入法解决问题 2 Failed to install the following Android SDK pac
  • C++之内联函数

    C 之内联函数 为什么要有内联函数 我们编写了一个小函数 它的功能是比较两个string形参的长度并返回长度较小的string的引用 挑出两个string 对象中较短的那个 返回其引用 const string shorterString