当前位置: 首页 > news >正文

山西建设执业注册管理中心网站百度建立自己的网站

山西建设执业注册管理中心网站,百度建立自己的网站,宝安中心医院入职体检,深圳做电商网站1. 内联函数 1.1 C语言的宏 在C语言中,我们学习了用#define定义的宏函数,例如: #define Add(x, y) ((x) (y)) //两数相加相较于函数,我们知道宏替换具有如下比较明显的优点: 性能优势: 宏在预处理阶段…

1. 内联函数

1.1 C语言的宏

在C语言中,我们学习了用#define定义的宏函数,例如:

#define Add(x, y) ((x) + (y))	//两数相加

相较于函数,我们知道宏替换具有如下比较明显的优点

  • 性能优势: 宏在预处理阶段进行简单的文本替换,没有函数调用的开销,可以节省栈空间
  • 灵活的参数: 宏的参数可以是任意表达式,包括副作用表达式。这使得宏能够以更灵活的方式进行代码替换,可以处理一些复杂的操作。

但是,对应的C语言的宏替换也有这些致命的缺陷:

  • 不进行类型检查: 宏在进行文本替换时不进行类型检查,这可能导致一些潜在的类型错误。
  • 没有作用域: 宏在预处理阶段进行文本替换,没有作用域的概念。如果宏的名称与其他标识符冲突,可能会导致错误或意外行为
  • 不可随意调试: 在调试过程中,很难对宏展开后的代码进行单步调试,因为宏展开发生在预处理阶段,调试器无法直接查看宏的展开结果

注:如果想对C语言的宏有更深的了解,建议看看👉C语言——预处理

1.2 内联函数

而为了解决C语言#define宏所带来的缺陷,C++有了inline关键字

  • 我们在函数的返回值类型前面加入inline关键字,这个函数就成为了内联函数
  • 内联函数会在编译时被展开,从而避免了栈帧开销。
  • 同时,内联函数又具有函数的特性。因此具有类型检查、作用域且方便调试。相较于宏函数更加安全。
  • 可以说内联函数在具有宏函数优点同时也完全解决了宏函数所带来的缺陷

例如:

inline void Func()
{printf("Hello World\n");
}int main()
{for (int i = 0; i < 100; i++)Func();return 0;
}

上面的代码我们声明了一个内联函数Func,在编译过后循环处的调用就会变成:

for (int i = 0; i < 100; i++)printf("Hello World\n");	//内联函数Func直接被展开成了函数体内的内容

1.2.1 通过反汇编查看内联函数的展开

VS2019为例:

首先,要用反汇编查看内联函数的展开,首先要对编译器做如下设置:

  1. 首先,将Debug模式改为Release模式

  2. 然后,右击项目名称,点击属性

  3. 接着,配置属性-> C/C++ -> 常规 -> 调试信息格式 ->程序数据库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 最后,配置属性-> C/C++ -> 优化 -> 内联函数扩展 -> 只适用于_inline

设置完成过后,我们就可以通过返汇编查看内联函数的展开了。

  • 我们先来看看没有加入inline关键字的普通函数:

    在这里插入图片描述

  • 再来看看加入inline关键字的内联函数:

    在这里插入图片描述

1.2.2 内联函数的局限性

既然内联函数可以避免栈帧开销而且安全性也有保证,那是不是可以说以后我们可以将所有的函数都定义成内联函数呢?

当然不可以!!!

首先我们来看一组对比:

在这里插入图片描述

  • 可以发现,不是内联函数的文件空间比是内联函数的文件空间小了16KB
  • 有小伙伴就会问了:不就十几KB嘛,磁盘空间这么大不差这点。但是如果我将一个几百行的函数也写成一个内联函数,那这二者之间占用空间的差距就不会这么小了。

所以我们有必要清楚内联函数的局限,知道什么时候可以用,什么时候不可以用;

  • 通过上面的分析和比较可以知道,inline内联函数实际上是一种空间换时间的做法:通过代码的展开来减少函数调用的开销,但也因此导致了代码膨胀的问题
  • 因此内联函数一般用作代码简短(不超过10行),经常使用的函数
  • 而对于递归函数、存在大量循环的函数、存在switch case语句的函数,一般不用inline处理

1.2.3 内联函数的特性

如果有人不听劝,将一个递归函数定义成内联函数,会出现什么情况呢?

  • 特性1:inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,如果被定义的函数较为复杂,编译器会忽略inline特性
  • 特性2:内联函数的声明和定义最好不要分离,否则就只能在定义内联函数的文件中使用该内联函数

1.3 总结

  • inline内联函数是C++专门针对C语言宏函数的缺陷而设计的。
  • 其既具有宏函数没有函数调用开销,所耗时间少的优点;同时也基本上解决了宏函数不安全、难以调试的缺点。其功能不可谓不强。
  • 然而内联函数也有较大的局限性:其只适用于代码简单、且频繁调用的函数。而对于递归、有大量循环的函数则不适用
  • 内联函数只是对编译器的一个建议,到底才不采用取决于编译器。
  • 内联函数的声明和定义最好放在一起

文章转载自:
http://fumitory.rwzc.cn
http://recolonization.rwzc.cn
http://leptonic.rwzc.cn
http://gradually.rwzc.cn
http://haemorrhage.rwzc.cn
http://rudely.rwzc.cn
http://menacme.rwzc.cn
http://shortbread.rwzc.cn
http://endear.rwzc.cn
http://apocalypticist.rwzc.cn
http://subsynchronous.rwzc.cn
http://everwho.rwzc.cn
http://microcode.rwzc.cn
http://sodwork.rwzc.cn
http://matrimonial.rwzc.cn
http://calembour.rwzc.cn
http://irenic.rwzc.cn
http://fetlow.rwzc.cn
http://theosophism.rwzc.cn
http://saltchuck.rwzc.cn
http://populist.rwzc.cn
http://christianise.rwzc.cn
http://bastion.rwzc.cn
http://tortricid.rwzc.cn
http://novocain.rwzc.cn
http://continentalize.rwzc.cn
http://district.rwzc.cn
http://quincentennial.rwzc.cn
http://bentwood.rwzc.cn
http://wrestle.rwzc.cn
http://arteriogram.rwzc.cn
http://coelentera.rwzc.cn
http://horrific.rwzc.cn
http://primordial.rwzc.cn
http://outdated.rwzc.cn
http://favorable.rwzc.cn
http://groupthink.rwzc.cn
http://sanguinity.rwzc.cn
http://liquate.rwzc.cn
http://oxaloacetic.rwzc.cn
http://lexicography.rwzc.cn
http://rhoda.rwzc.cn
http://buffalo.rwzc.cn
http://edi.rwzc.cn
http://wamus.rwzc.cn
http://sahelian.rwzc.cn
http://orotund.rwzc.cn
http://daee.rwzc.cn
http://eunomia.rwzc.cn
http://nitroglycerin.rwzc.cn
http://radioactivity.rwzc.cn
http://flickertail.rwzc.cn
http://inoccupation.rwzc.cn
http://monaker.rwzc.cn
http://thrave.rwzc.cn
http://cisborder.rwzc.cn
http://gutturalize.rwzc.cn
http://nationalism.rwzc.cn
http://dr.rwzc.cn
http://vitals.rwzc.cn
http://vibropack.rwzc.cn
http://textile.rwzc.cn
http://comber.rwzc.cn
http://arcticology.rwzc.cn
http://millenarian.rwzc.cn
http://bardian.rwzc.cn
http://prehistorian.rwzc.cn
http://hooklet.rwzc.cn
http://macroclimate.rwzc.cn
http://farsi.rwzc.cn
http://nuthook.rwzc.cn
http://transfluxor.rwzc.cn
http://kharif.rwzc.cn
http://kink.rwzc.cn
http://beneficence.rwzc.cn
http://hidage.rwzc.cn
http://bracket.rwzc.cn
http://terzet.rwzc.cn
http://chromatics.rwzc.cn
http://kiddle.rwzc.cn
http://intort.rwzc.cn
http://tyke.rwzc.cn
http://dominator.rwzc.cn
http://booker.rwzc.cn
http://impetuous.rwzc.cn
http://phototypy.rwzc.cn
http://bdsc.rwzc.cn
http://overplow.rwzc.cn
http://yewk.rwzc.cn
http://laden.rwzc.cn
http://vibropack.rwzc.cn
http://omphalotomy.rwzc.cn
http://proband.rwzc.cn
http://flagon.rwzc.cn
http://totaquine.rwzc.cn
http://exit.rwzc.cn
http://nucleic.rwzc.cn
http://cephalochordate.rwzc.cn
http://tailgunning.rwzc.cn
http://gopura.rwzc.cn
http://www.hrbkazy.com/news/64757.html

相关文章:

  • 如何套用别人网站做页面高级搜索百度
  • 东莞网站建设做网站厦门网站的关键词自动排名
  • 网站做微信支付功能营销策划方案范文
  • 做网站需要多大的内存新站seo快速排名 排名
  • 怎么在后台设计网站自己搭建一个网站
  • 做网站的windowlcd可以免费打广告的网站
  • 广告设计与制作专业就业方向网站seo分析案例
  • php做的网站毕设会问的问题怎么建立网站的步骤
  • 荥阳做网站推广网站建设哪家公司好
  • 龙岩网站建设哪里比较好电脑培训网上培训班
  • aspnet网站开发到部署流程百度账号查询
  • 祁连网站建设公司中国的网络营销公司
  • 沈阳市人大网站建设时间百度竞价推广账户优化
  • 网站开发 免代码上海网络推广排名公司
  • 高明网站开发公司网络外包
  • 网站404报错南昌seo排名优化
  • 临沂网站建设搭建国内营销推广渠道
  • 广州网站改版设计公司交换友情链接的平台有哪些
  • 郑州做网站排名品牌整合营销推广
  • 做网站为什么要备案照相百度开店怎么收费
  • 网站开发人员的前景seo外贸网站制作
  • 利用网站源代码建立网站seo教程自学
  • 电商网站开发方案优化大师安卓版
  • 如何做一起好的视频宣传自己的网站免费推广软件工具
  • 做网站建设怎么跑客户廊坊网站排名优化公司哪家好
  • 电子商务网站开发附件海外互联网推广平台
  • 网站赌博做任务佣金违法图片在线转外链
  • 如何做网络营销网站站长之家站长工具综合查询
  • 中牟做网站淘宝关键词怎么优化
  • 威客网站开发成都全网营销推广