zoukankan      html  css  js  c++  java
  • c++内联函数与静态函数

    不能是虚函数的成员函数有:静态成员函数,内联成员函数,构造函数
    没有什么函数需要硬性规定为虚函数,一般析构函数会被定义为虚函数
    其他就是在继承类中可能需要override的类成员函数应该定义为虚函数

    http://www.cnblogs.com/this-543273659/archive/2011/08/17/2143607.html

    1.内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。 
    2.我们之所以能看到一些象内联函数的虚函数,是因为某个函数是否是内联函数不是由我们说的算,而是由编译器决定的。我们只能向编译器建议,某个函数可以是内联函数(inline关键字),但是编译器有自己的判断法则。所以可能出现这样的情况: 
        2.1   我们用inline声明的函数却没有inline 
        2.2   我们没有用inline声明的函数却是inline 
        2.3   对于inline函数,编译器仍然将它编译成一个有地址的函数 
    所以,情况比较复杂,从high-level来看的话很难判断函数是否是inline的,如果从low-level来看的话就比较清晰,非内联函数遵从函数调用机制,在汇编中用call来调用。内联函数则没有这些。

    inline函數表示該函數是内聯的,它建議編譯器在調用該函數的地方直接將函數的代碼展開來 
    插入caller的代碼中.這個只是一種指示至於會不會被内聯編譯器還會根據被聲明為inline 
    的函數的内部結構如:是否包含循環,複雜的函數調用等等來選擇是否inline。 
    1.虛函數肯定不會被内聯這一點毋庸置疑,因為虛函數只有到了Runtime才能被識別到底是哪一個被 
        調用,而内聯是編譯期就會將代碼展開並安插這個明顯不是一囘事。 
    2.inline有兩种表現方式一種就是以inline在實現文件中(.cpp)指出這被稱爲顯示内聯,另外一種 
        就如你所說類的聲明和定義放入同一個文件這稱爲隱式内聯,但是還是如前面所說inline只是一個 
        提示符至於會不會内聯還是由編譯器說了算。

    
    
    常见的不能声明为虚函数的有:普通函数(非成员函数)、静态成员函数、内联成员函数、构造函数友元函数。
    1、为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时绑定函数。2、为什么C++不支持构造函数为虚函数?这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来是为了明确初始化对象成员才产生的,然而virtual function主要是为了在不完全了解细节的情况下也能正确处理对象。另外,虚函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用虚函数来完成你想完成的动作。3、为什么C++不支持静态成员函数为虚函数? 静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他不归某个对象所有,所以他也没有动态绑定的必要性。4、为什么C++不支持内联成员函数为虚函数? 其实很简单内联函数就是为了在代码中直接展开,减少函数调用话费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。再说,inline函数在编译时被展开,虚函数在运行时才能动态的绑定函数。5、为什么C++不支持友元函数为虚函数?因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。

    在C++中,用户可以创建实际上不调用的短函数,他们的代码在每次调用的程序行里得到扩展。这个过程类似于使用类似函数的宏。为使一个函数在程序行进行代码扩展而不被调用,只要在函数前面加上关键字inline即可。

    构造函数和析构函数也可以是内联的。

      例如,在下面的程序,函数max()在行内扩展而不被调用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    using namespace std;
    inline int max(int a, int b)
    {
        return a>b?a:b;
    }
    int main()
    {
        cout<<max(10,20);
        cout<<" "<<max(99,88);
    }

      上面的程序等价于下面的程序:

    1
    2
    3
    4
    5
    6
    7
    #include <iostream>
    using namespace std;
    int main()
    {
        cout<<(10>20?10:20);
        cout<<" "<<(99>88>99:88);
    }

      内联函数是C++的一个重要补充的原因是,他们能使程序员写出非常有效的代码。因为类一般要求几个经常被执行的接口函数,因此,这些函数的效率在C++中是非常重要的。我们知道,每次调用函数时,变元要进栈,各种寄存器内容要保存;函数返回时,又要恢复他们的内容。问题是这些指令要占用时间。但是,如果函数在行内扩展,上述那些操作就不存在了。当然,虽然函数行内扩展能产生较快的速度,但由于重复编码会产生较长的代码,因此最好只内联那些能明显影响程序性能的函数。

      inline对编译器是一种请求,而不是命令。编译器可以选择忽略它。还有,一些编译器不能内联所有类型的函数。例如,通常编译器不能内联递归函数。必须查阅自己的编译器用户手册以了解对内联的限制。如果一个函数不能被内联,它就被当作一个正常的函数调用。

      inline关键字不是C++的 C子集 的一部分,因此,C89没有定义它,然而,C99中增加了它。

      内联函数可以是类的成员。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class myclass{
        int a,b;
    public:
        void init(int i,int j);
        void shou();
    };
    inline void myclass::init(int i,int j)
    {
        a = i;
        b = j;
    }
    inline void myclass::show()
    {
        cout<<a<<" "<<b<<" ";
    }
    • 在类声明内定义内联函数

      在类声明内(大括号之内)定义内联函数是可能的。如果一个函数是在类声明内定义的,它将自动的转换成内联函数(如果可能的话)。没有必要(但不是错误)在函数声明的前面再加上关键字inline。

    1
    2
    3
    4
    5
    6
    7
    class myclass{
        int a,b;
    public:
        //automatic inline
        void init(int i, int j){a=i;b=j;}
        void show(){cout<<a<<" "<<b<<" ";}
    }
    
    

    在C++中,用户可以创建实际上不调用的短函数,他们的代码在每次调用的程序行里得到扩展。这个过程类似于使用类似函数的宏。为使一个函数在程序行进行代码扩展而不被调用,只要在函数前面加上关键字inline即可。

     

  • 相关阅读:
    vue中v-on支持的事件总结
    DateTimePicket jQuery 日期插件,开始时间和结束时间示例
    电脑C盘空间不足
    overflow text-overflow 超过部分隐藏问题
    linux中find,locate,whereis,which关系和用法
    关于jQuery中toggle参数callback函数提前执行问题
    php中的几种四舍五入取整、向上取整、向下取整、小数截取方法
    Linux中su、su -和sudo的区别
    华硕X450j清灰教程
    mysql关键字汇总
  • 原文地址:https://www.cnblogs.com/dongzhuangdian/p/5080873.html
Copyright © 2011-2022 走看看