c 中的宏、内联函数及宏的比较.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c++中的宏、内联函数和宏的比较.txt人和人的心最近又最远,真诚是中间的通道。试金可以用火,试女人可以用金,试男人可以用女人--往往都经不起那么一试。c++中的宏 介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的 功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如 #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++中,在类的内部定义了函数体的 函数,被默认为是内联函数。而不管你是否有inline关键字。   内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的 类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我 们类成员的数据了。 对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把 这些读写成员函数定义成内联函数的话,将会获得比较好的效率。 Class sample{  Private:   Int nTest;  Public:   Int readtest(){ return nTest;}  Void settest(int I) {nTest=

文档评论(0)

0520 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档