码迷,mamicode.com
首页 > 编程语言 > 详细

C++ inline 内联函数

时间:2020-03-11 19:39:12      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:效率   应用   声明   col   turn   vat   操作   内存   调用   

【题目2-22】为什么要引入内联函数?

引入内联函数的主要目的是,用它替代C语言中表达式形式的宏定义来解决程序中函数调用的效率用题。C语言的宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等乙烯利从操作,因此效率很高。但是在用时,仅仅只是做预处理符号表中的简单替换,因此宏定义不能进行参数有效性的检,也就不能销售C++编译器严格类型检查的好处。另外,宏定义的返回值不能被强制转化为合适类,这样,宏定义的使用就存在着一系列的隐患和局限性。

另外,在C++中引入了类及类型的访问限制,这样,如果一个操作或者说一个表达式涉及类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。inline推出的目的就是为了取代这种表达式的宏定义,消除它的缺点同时又很好地继承了它的优点。

【题目2-23】为什么 inline 能很好地取代表达式形式的预定义

  • inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高
  • 类的内联函数也是一个真正的函数。编译器在调用一个内联函数时,首先会检查它的参数类型,保证调用正确;然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性
  • inline 可以作为某个类的成员函数,当然就可以在其中使用所有类的保护成员以及私有成员

【题目2-24】说明内联函数使用的场合

使用 inline 函数可以完全取代表达式形式的宏定义

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

 1 class A{
 2 private:
 3     int nTest;
 4 public:
 5     int readTest(){return nTest;}
 6     void setTest(int i);
 7 };
 8 inline void A::setTest(int i){
 9     nTest = i;
10 }

类A的成员函数 readTest() 和 setTest() 都是 inline 函数

  • readTest() 函数的定义体被放在类声明中,因而 readTest() 自动转换成 inline 函数
  • setTest()函数的定义体在类声明外,因而要加上inline关键字。

【题目2-25】为什么不把所有的函数都定义成内联函数

内联是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收获会很少。另一个方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联

  1. 如果函数体内的代码比较长,使用内联函数将导致内存消耗代价较高
  2. 如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大
  3. 类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如‘偷偷地’执行了基类或成员对象的构造函数和析构函数。所以,不要随便地将构造函数和析构函数的定义体放在类声明中

注意:一个好的编译器将会更具函数的定义体,自动地取消不值得的内联 (这说明了 inline 不应该出现在函数的声明中)

【题目2-26】内联函数与宏又什么区别?

  • 内联函数在编译时展开,宏在预编译时展开
  • 在编译的时候,内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的文本替换
  • 内联函数可以完成诸如类型检测,语句是否正确等编译功能,而宏就不具有这样的功能
  • 宏不是函数,inline 函数是函数
  • 宏在定义时要小心处理宏参数(一般情况是把参数用括号括起来),否则会出现二义性。而内联函数定义时不会出现二义性

 

C++ inline 内联函数

标签:效率   应用   声明   col   turn   vat   操作   内存   调用   

原文地址:https://www.cnblogs.com/jg01/p/12464755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!