zoukankan      html  css  js  c++  java
  • C++: 内联函数

    转自:http://www.cnblogs.com/singa/archive/2008/09/24/1297821.html

    (1)什么是内联函数?
    内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。

    (2)为什么要引入内联函数?
    当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题。另外,前面我们讲到了宏,里面有这么一个例子:
    #define ABS(x) ((x)>0? (x):-(x))
    当++i出现时,宏就会歪曲我们的意思,换句话说就是:宏的定义很容易产生二意性。
      
    我们可以看到宏有一些难以避免的问题,怎么解决呢?前面我们已经尽力替换了。

    下面我们用内联函数来解决这些问题。

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

    (4)内联函数和宏的区别?
    内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。内联函数与带参数的宏定义进行下比较,它们的代码效率是一样,但是内联欢函数要优于宏定义,因为内联函数遵循的类型和作用域规则,它与一般函数更相近,在一些编译器中,一旦关上内联扩展,将与一般函数一样进行调用,比较方便。 

    (5)什么时候用内联函数?
    内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成
    员函数定义成内联函数的话,将会获得比较好的效率。
    Class A
    {
    Private:
    int nTest;
     Public:
    int readtest() { return nTest;}
    void settest(int I) { nTest=I; }
    }

    (6)如何使用内联函数?
    我们可以用inline来定义内联函数。
    inline int A (int x) { return 2*x; }
    不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。

    (7)内联函数的优缺点?
    我们可以把它作为一般的函数一样调用,但是由于内联函数在需要的时候,会像宏一样展开,所以执行速度确比一般函数的执行速度要快。当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。(换句话说就是,你使用内联函数,只不过是向编译器提出一个申请,编译器可以拒绝你的申请)这样,内联函数就和普通函数执行效率一样了。

    (8)如何禁止函数进行内联?
    如果使用VC++,可以使用/Ob命令行参数。当然,也可以在程序中使用 #pragma auto_inline达到相同的目的。

    (9)注意事项:
    1.在内联函数内不允许用循环语句和开关语句。
    2.内联函数的定义必须出现在内联函数第一次被调用之前。

  • 相关阅读:
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    Atitit.文件搜索工具 attilax 总结
    Atitit.文件搜索工具 attilax 总结
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
  • 原文地址:https://www.cnblogs.com/llxblogs/p/7476112.html
Copyright © 2011-2022 走看看