千家信息网

C++的内联函数怎么使用

发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,本文小编为大家详细介绍"C++的内联函数怎么使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++的内联函数怎么使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、常
千家信息网最后更新 2025年02月22日C++的内联函数怎么使用

本文小编为大家详细介绍"C++的内联函数怎么使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++的内联函数怎么使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、常量与宏回顾

C++中的const常量可以替代宏常数定义,如︰

但是C++中是否有解决方替代宏代码片段呢?这里就要引入内联函数。

二、内联函数

  • C++中推荐使用内联函数替代宏代码片段

  • C++中使用 inline 关键字声明内联函数

内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求

  • C++编译器可以将一个函数进行内联编译

  • 被C++编译器内联编译的函数叫做内联函数

  • C++编译器直接将函数体插入函数调用的地方

  • 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)

C++编译器不一定满足函数的内联请求

下面先看一段宏定义的代码:

#include #define FUNC(a, b) ((a) < (b) ? (a) : (b))inline int func(int a, int b){    return a < b ? a : b;}int main(int argc, char *argv[]){    int a = 1;    int b = 3;    int c = FUNC(++a, b);    printf("a = %d\n", a);    printf("b = %d\n", b);    printf("c = %d\n", c);    return 0;}

下面为输出结果,c =FUNC(++a, b),等价于 c =((++a) < (b) ? (++a) : (b)),先执行(++a) < (b),得到 a =,2,b = 3,由于 ++a 比 b 小,所以输出 ++a,这个时候 a = 3,所以 c 也等于 3。

如果使用内联函数,

#include #define FUNC(a, b) ((a) < (b) ? (a) : (b))inline int func(int a, int b){    return a < b ? a : b;}int main(int argc, char *argv[]){    int a = 1;    int b = 3;    int c = func(++a, b);    printf("a = %d\n", a);    printf("b = %d\n", b);    printf("c = %d\n", c);    return 0;}

输出结果如下:

下面在 VS2012 中看一下反汇编的代码,看一看内联有没有成功。可以看到 func 函数被调用,而不是直接扩展到被调用的地方,内联没有成功。inline 这个关键字仅仅是请求将函数内联,但是不一定会成功。

为了让编译器允许对内联的请求,可以对编译器进行一些配置,如下图

配置好以后,在 int c = func(++a, b); 前面打个断点,开始跑代码,但是我跑的时候报错了。

这个时候,进行下面配置,那个错误就解决了。

这个时候在进行反汇编,如下图所示,可以看到调用函数的汇编代码没有了,表示内联成功了。

  • 内联函数具有普通函数的特征(参数检查,返回类型等)

  • 函数的内联请求可能被编译器拒绝

  • 函数被内联编译后,函数体直接扩展到调用的地方

宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用。

现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译

一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如︰

  • g++ : _attribute__((always_inline)) 属性

  • MSVC : _forceinline

三、内联函数使用注意事项

C++中 inline 内联编译的限制:

  • 不能存在任何形式的循环语句

  • 不能存在过多的条件判断语句

  • 函数体不能过于庞大

  • 不能对函数进行取址操作

  • 不能对函数进行取址操作

读到这里,这篇"C++的内联函数怎么使用"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

函数 编译 C++ 编译器 代码 成功 时候 关键 关键字 地方 文章 片段 输出 配置 普通 内容 常量 结果 语句 处理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网上支付软件开发 北京百游江通网络技术有限公司 陕西一众宝网络技术有限公司 江苏网络技术基础 医疗网络安全自查报告 天津正规软件开发设施服务标准 网络安全防范技术专业 关基单位 网络安全监督检查 scada采用商业数据库的目的 猪猪创想网络技术 网络安全预警发布内容 软件架构师是学软件开发的吗 网络安全黑抄报 云服务器一直在攻击怎么办 哈尔滨市目前数据库招聘工资多少 mysql查看数据库表修改记录 数据库技术视频 银行有啥数据库 大学生网络安全教育数据分析 邮件无法发送smtp服务器 大学生如何保护网络安全 软件开发工具称为 战颜互联网科技有限公司 如何把服务器接到阿里 数据库带日志文件吗 如何在数据库更新序号 公安网络安全工作是干嘛的 北京应用软件开发正规平台 软件开发属于哪个产业 陕西先通网络技术学院能考华为吗
0