- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
宏和内联函数的区别
介绍内联函数之前, 有必要介绍一下预处理宏。 内联函数的功能和预处理宏的
功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如
#define TABLE_COMP(x) ((x)0?(x):0)
就定义了一个宏。
为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数
所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行
该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地
址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一
定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把
代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个
函数更有效率。
但是宏也有很多的不尽人意的地方。
1、.宏不能访问对象的私有成员。
2、.宏的定义很容易产生二意性。
我们举个例子:
#define TABLE_MULTI(x) (x*x)
我们用一个数字去调用它 ,TABLE_MULTI(10),这样看上去没有什么错误,
结果返回 100, 是正确的,但是如果我们用 TABLE_MULTI(10+10)去调用的话,
我们期望的结果是 400,而宏的调用结果是 (10+10*10+10), 结果是 120,这显
然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。
#define TABLE_MULTI(x) ((x)*(x))
这样可以确保不会出错,但是,即使使用了这种定义,这个宏依然有可能
出错,例如使用 TABLE_MULTI(a++)调用它,他们本意是希望得到 (a+1)*(a+1) 的
结果,而实际上呢?我们可以看看宏的展开结果 : (a++)*(a++) ,如果 a 的值是
4 ,我们得到的结果是 5*6=30 。而我们期望的结果是 5*5=25, 这又出现了问题。
事实上,在一些 C 的库函数中也有这些问题。例如 : Toupper(*pChar++) 就会对
pChar 执行两次 ++操作,因为 Toupper 实际上也是一个宏。
我们可以看到宏有一些难以避免的问题,怎么解决呢?
下面就是用我要介绍的内联函数来解决这些问题,我们可以使用内联函数
来取代宏的定义。而且事实上我们可以用内联函数完全取代预处理宏。
内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是
通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时
候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开
销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一
些问题。
我们可以用 Inline 来定义内联函数,不过,任何在类的说明部分定义的函
数都会被自动的认为是内联函数。
下面我们来介绍一下内联函数的用法。
内联函数必须是和函数体申明在一起,才有效。像这样的申明
Inline Tablefunction(int I) 是没有效果的,编译器只是把函数作为普通的函
数申明,我们必须定义函数体。
Inline tablefunction(int I) {return I*I};
这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调
用。但是执行速度确比一般函数的执行速度要快。
我们也可以将定义在类的外部的函数定义为内联函数,比如:
Class TableClass{
Private:
Int I,j;
Public:
Int add() { return I+j;};
Inline int dec() { return I-j;}
Int GetNum();
}
inline int tableclass::GetNum(){
return I;
}
上面申明的三个函数都是内联函数。在 C++中,
您可能关注的文档
最近下载
- 奔图 PANTUM CM7105DN 7105 彩色激光打印机中文维修手册.pdf VIP
- 一种居民电热水器负荷需求侧响应可调控潜力评估方法.pdf VIP
- 供货能力及方案.docx VIP
- 世界建筑史(南京大学) 超星尔雅学习通网课章节测试答案.docx VIP
- AO3400宽体数据手册下载.pdf VIP
- 22J943-1、22G621-1 既有建筑改造设计与施工(既有住宅增设电梯).docx VIP
- 6.2交友的智慧 (课件)-2025-2026学年 道德与法治 七年级上册(统编版).pptx VIP
- 车管所保安保洁服务保洁服务实施方案.docx VIP
- 车管所保安保洁服务保安服务实施方案.docx VIP
- 高考英语书面表达模板(最新版).docx VIP
原创力文档


文档评论(0)