目录
- 一、常量与宏回顾
- 二、内联函数
- 三、内联函数使用注意事项
- 四、小结
一、常量与宏回顾
C++中的const常量可以替代宏常数定义,如︰
但是C++中是否有解决方替代宏代码片段呢?这里就要引入内联函数。
二、内联函数
- C++中推荐使用内联函数替代宏代码片段
- C++中使用 inline 关键字声明内联函数
内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
- C++编译器可以将一个函数进行内联编译
- 被C++编译器内联编译的函数叫做内联函数
- C++编译器直接将函数体插入函数调用的地方
- 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)
C++编译器不一定满足函数的内联请求
下面先看一段宏定义的代码:
#include <stdio.h>
#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 <stdio.h>
#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++中可以通过 inline 声明内联函数
- 编译器直接将内联函数体扩展到函数调用的地方
- inline 只是一种请求,编译器不一定允许这种请求
- 内联函数省去了函数调用时压栈,跳转和返回的开销
相关推荐:
GPT-3模型下载:开启智能时代的无限可能,ai走入
用AI写文章:效率与创意的完美结合
SEO中的别类词:提升排名,轻松超越竞争对手,ai插画生肖
怎么用AI写文:让创作更轻松,效率翻倍
seo经理做什么的,seo经理招聘 ,盲人ai眼镜
好用的AI智能工具,让生活与工作更高效!
ChatGPT不能加载过去的对话,如何提升你的使用体验?,ai智能衣服
2024年AI写文章生成器推荐:让创作轻松高效,提升写作水平
什么是秀米?全方位了解这款微信公众号排版神器,宁波全网营销型网站建设
文章疑似AI生成怎么办?如何辨别并应对AI生成文章的挑战
SEO重要性与企业互联网发展的必由之路,互联网营销推广平台设计
文字写作AI生成工具:让创作更简单、更高效
WPQQ-开启数字时代的智能连接新纪元,杭州网站推广厂家电话
SEO建站,开启网站优化的全新篇章!,网络营销推广合作方式
ChatGPT诞生背景:人工智能如何突破语言的边界,ai辅助市场调研
SEO精通:让你的内容在搜索引擎中脱颖而出,跨境电商 推广营销
SEO搜外:全球搜索引擎优化的秘密武器,如何选择网站建设类型呢
ChatGPT免费订阅的使用限制:其潜力与挑战,ai辅助线无法对齐画板
SEO新人必读:从零开始SEO的核心技巧与实践指南,网站邮件推广设计
AI人工智能:开发与应用的必备软件推荐
SEO快速优化文章排名:提升网站流量的必备技巧,ai小苹果会员分享
AI文章精简-高效提炼与优化你的内容创作,ai quid
什么是seo技术,什么是seo及seo的作用 ,AI倒放仓鼠
seo的推广工具,seo推广软件哪个好 ,国内ai写作论文怎么样
SEO收费如何选择合适的SEO服务,提升网站排名并增加曝光度,做网站优化哪家实惠
SEO合同:确保您网站优化成功的关键保障,微博营销推广规则最新
SEO总计:如何通过SEO优化实现网站流量和排名的飞跃,三元桥网站优化
如何用AI写公众号文章?让创作更高效、更轻松
seo网站是什么东西,seo网站是什么东西啊 ,ai锯齿消失
AI缩短短文-提升创作效率,写作新体验,光速写作业ai写作app
为什么seo推广那么多,seo推广难吗 ,东莞ai听译平台
SEO广告:如何借助SEO提升品牌曝光与销售业绩?,网站推广怎么选择
AI缩写文本:助力智能生活的革新力量,ai智能写作生成神器下载
SEO合作:让你的网站在搜索引擎中脱颖而出,惠州抖音seo策划公司
“多网建站”助力企业跨越发展,开启全新数字化时代,海南网站优化电池
seo管理系统是什么,seo网站管理 ,过度圆ai
软件AI的全称:人工智能驱动未来的关键力量
SEO项目:如何通过精确优化提升企业网站排名与转化率,武汉做网站优化的公司
SEO走动:提升网站流量的关键一步,SEO数据监控宝宝推荐
seo需要做些什么,做seo的 ,超级ai地图
Chatget免费网站版无需登录,畅享无限对话体验!,工业 Ai 视觉检测
seo用什么论坛引流,seo引流方法 ,ai写作续写神器
ChatGPT打不开实时问题解决方案:让你的AI助手始终在线,psd 转ai
ChatGPT的VPN梯子:畅享全球互联网自由,打破地域限制,一直搜Ai
为什么选择老域名注册,打造品牌价值的秘密武器,网站建设服务费用多少
SEO这样做,轻松引爆流量,助力企业成长,无极标准网站优化好处
为什么说seo这么重要,seo重要吗 ,ai19920403
《收录情况:数字时代的网络信息检索与价值体现》,山东全域营销推广软件客服电话
《*采集站:带你领略全球最全*资源的宝藏平台》,seo优化易下拉瞧瞧
AI缩写在线:让人工智能助力你行业前沿技术,ai uhrehara