`

【编程珠玑】内联函数和宏

 
阅读更多

一,内联函数的用法


  内联函数从源码层层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。


  inline Tablefunction(int I) //是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。
  Inline tablefunction(int I) {return I*I}; //这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。


内联函数必须是和函数体申明在一起,才有效。


【注意】我们也可以将定义在类的外部的函数定义为内联函数,比如:

  
上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。


二,内联函数的应用(可以访问对象的私有成员

内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。

  
  当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。


三,内联函数注意事项

1,在内联函数内不允许用循环语句和开关语句。否则编译将该函数视同普通函数

2,递归函数(自己调用自己的函数)是不能被用来做内联函数的。

3,内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。 

4,内联函数的定义必须出现在内联函数第一次被调用之前。 

5,类结构中所有在类说明内部定义的函数是内联函数。


四,宏的定义

带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换或者进行阐述替换。

宏展开:在c程序编译时将宏名替换成字符串的过程

#define max(a,b) ( (a)>(b) ) ? (a):(b)


五,宏的局限性


  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,我们得到的结果是4*4 = 16,a = 6。我们期望得到的是 5*5 = 25


六,内联函数和宏的区别

宏是由预处理器对宏进行替代,内联函数是编译器控制来实现的。

内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。

你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

分享到:
评论

相关推荐

    编程珠玑 编程珠玑 编程珠玑 编程

    《编程珠玑》是一本经典的计算机科学与编程书籍,作者是Jon Bentley。这本书以其独特的视角深入探讨了程序设计的艺术和技巧,旨在提升程序员的问题解决能力,优化算法,并提高代码效率。书中涵盖了一系列实用的编程...

    编程珠玑 第2版(修订版)_编程珠玑修订_资料_

    《编程珠玑 第2版(修订版)》是一本深受程序员喜爱的经典著作,它不仅提供了丰富的编程实践经验,还深入探讨了程序设计的艺术与智慧。这本书的修订版更是在原版基础上进行了更新和完善,旨在帮助程序员提升编程技能,...

    编程珠玑源码下载编程珠玑书后源代码

    《编程珠玑》是计算机科学领域的一本经典之作,由Jon Bentley 编著,它以其深入浅出的方式探讨了程序设计的问题和解决方案,尤其在数据结构、算法优化以及问题解决策略方面有着独到的见解。这本书的源代码是作者为了...

    编程珠玑(续)

    《编程珠玑(续)》是计算机科学方面的经典名著《编程珠玑》的姊妹篇,讲述了对于程序员有共性的知识。书中涵盖了程序员操纵程序的技术、程序员取舍的技巧、输入和输出设计以及算法示例,这些内容组成一个有机的整体,...

    编程珠玑 编程珠玑续

    5. **程序设计思想**:探讨了模块化设计、函数复用、面向对象编程等概念,强调了可读性和可维护性在软件开发中的价值。 在《编程珠玑续》中,作者进一步扩展了这些主题,引入了更多现代编程实践和技术: 1. **算法...

    编程珠玑 Programming Pearls 第二版(中文版+源代码)

    《编程珠玑》是计算机科学领域的一本经典之作,作者是Jon Bentley,它以其独特的视角和深入浅出的讲解方式,向读者展示了编程艺术的精髓。这本书的第二版更是深受程序员和计算机科学家们的喜爱,因为它不仅涵盖了...

    编程珠玑(第二版)答案

    根据提供的标题“编程珠玑(第二版)答案”和描述“编程珠玑(第二版)答案”,我们可以推测出这是关于《编程珠玑》这本书的相关解答资料。《编程珠玑》是一本经典的计算机科学书籍,作者为Jon Bentley。本书旨在...

    编程珠玑.pdf

    第一部分 编 程 技 术 第1章 性能监视工具 3 1.1 计算素数 3 1.2 使用性能监视工具 7 1.3 一个专用的性能监视工具 8 1.4 开发性能监视工具 10 1.5 原理 11 1.6 习题 11 1.7 深入阅读 12 第2章 关联数组 13 ...

    编程珠玑续本

    编程珠玑续、编程珠玑续本、编程珠玑续本、编程珠玑续本

    编程珠玑II(编程珠玑·续) 扫描版6.56M pdf格式

    编程珠玑II(编程珠玑·续) 扫描版6.56M pdf格式

    《编程珠玑》源代码

    《编程珠玑》第一版是我早期职业生涯中阅读过的对我影响较大的书籍之一,在书中首次接触到的很多观点都让我长期受益。作者在这一版本中做了重要更新。新增加的很多例子让我耳目一新。 ——Steve McConnell,《代码...

    编程珠玑(PDF带目录)

    《编程珠玑》是一本享有盛誉的计算机科学与编程领域的经典著作,它以其深入浅出的讲解方式和丰富的实例,深受程序员和计算机科学爱好者的喜爱。这本书的主要内容围绕算法展开,旨在帮助读者掌握如何有效地解决编程...

    编程珠玑及其源码

    编程珠玑,编程珠玑续以及源码,本书针对程序设计人员探讨了一系列的实际问题,这些问题是对现实中常见问题的归纳总结。作者虽然没有给出解决这些问题的具体代码,但始终非常富有洞察力和创造力地围绕着这些折磨...

    编程珠玑源代码

    《编程珠玑源代码》是针对经典书籍《编程珠玑》第二版的源代码集合,主要涵盖C语言和C++编程。这本书以其独特的视角和深入浅出的讲解方式,深受程序员喜爱,尤其对于数据结构、算法和程序设计思维的提升有着重要的...

    编程珠玑番外篇

    Lisp,全称“List Processing”,是一种历史悠久且功能强大的动态类型编程语言,以其独特的语法和宏系统著称。Lisp的哲学强调代码即数据,这使得它在函数式编程领域有着深远的影响。通过阅读徐宥的文章,读者可以...

    编程珠玑(经典)

    《编程珠玑》是计算机科学领域的一本经典著作,作者是Jon Bentley。这本书以其深入浅出的讲解方式,探讨了程序设计中的一些核心问题,并提供了许多实用的编程技巧和算法,被誉为程序员的“智慧之石”。它不仅仅是一...

    编程珠玑(第2版)中文版pdf

    《编程珠玑》是由Jon Bentley所著的一本计算机程序设计的经典著作,它在计算机科学领域内具有非常高的声誉。这本书深入探讨了计算机程序设计中的诸多方面,尤其强调了程序设计过程中洞察力和创造力的重要性。 Jon ...

    编程珠玑1和2

    《编程珠玑1和2》是两本深受程序员喜爱的经典著作,主要涵盖了C语言的深入理解和实践技巧。这本书籍不仅适合初学者,也对有经验的开发者提供了宝贵的洞见。以下将详细介绍这两本书中涉及的一些核心知识点。 1. **...

Global site tag (gtag.js) - Google Analytics