内联函数

来源:互联网 发布:java初学者入门指南 编辑:程序博客网 时间:2024/06/13 08:29

1、预处理器的缺陷

    宏定义是完全的替换,所以表达式在宏内展开,它们的优先级不同于所期望的优先级,

    所以在使用宏是,要把所有运算都显示的用()括起来。

    在C++中宏的概念是作为内联函数实现的,但内联函数却是真正的函数,内联函数能像普通的函数一样具有所期望的任何行为,唯一不同的是内联函数在适当的地方像宏一样展开,因此应该永远不使用宏,只使用内联函数。

 

2、内联函数

  1) 任何在类中定义的函数自动成为内联函数,也可以在非类的函数前面加上inline关键字使之成为内联函数。

 必须是函数体和声明结合在一起,否则,编译器将它作为普通函数 对待。

  2)一般应该把内联函数放在头文件内,当编译器看到这个定义是,它把函数类型(函数名+返回值)和函数体放到符号表里。编译器检查确保调用是正确的且返回值被正确使用,然后将函数调用替换为函数体,内联代码占用空间,适合函数较小的函数体。假如函数较大,由于需要在调用函数的每一处重复复制到吗,这样将是代码膨胀。

   3)类中内联函数的最重要的使用之一是做访问函数(类似set、get)

3、内联函数和编译器

   1)对于任何函数,编译器在他的符号表里放入函数类型,当编译器看到内联函数和对内联函数和对内联函数体进行分析没有发现错误时,就将对应于函数体得代码也放入符号表,不同的编译器存放代码方式不同(有的是存入源程序,有的是存入汇编指令)。

   2)当调用一个内联函数,编译器确保调用正确(与预处理器不同的地方),如果所有都符合,内联函数代码就会直接体寒函数调用。

4、内联函数限制

  1)函数太复杂,编译器将不能执行内联;

  2)要显示或隐式的取函数地址,编译器也不能执行内联。

5、向前引用

  C++规定只有在内声明结束后,其中的内联函数才会被计算。所以在类中,内联函数可以调用目前还没声明的函数

  class Forward

{

     int i;

     public:

       Forward():i(0){}

       int f() const{return g();}//合法

       int g() const{return i;}

};

当g()也调用f()函数时导致递归调用,对于编译器来说太复杂而不能执行内联。

6、构造函数和析构函数中的内联

   类中的构造函数和析构函数也是内联函数,它其中的成员自动调用的构造函数和析构函数也是内联的。

原创粉丝点击