搜尋

首頁  >  問答  >  主體

c++ - 内联与虚函数

#include <iostream>

using namespace std;

class A
{
    virtual void func()
    {
        cout << "zz\n";    
    }
    virtual void prin();
};

inline void A::prin()
{
    cout << "h";
}

int main()
{
    return 0;
}

为什么inline可以修饰virtual函数呢?虚函数调用不是要在运行时才能确定吗?而inline不是要在编译时就展开吗?

伊谢尔伦伊谢尔伦2773 天前371

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-17 14:55:32

    作用非常有限,編譯器通常會無視inline修飾,當然也有例外:
    inline virtual只有當物件類型在編譯時被確定時才會起作用,也就是呼叫這個inline virtual的caller不能是引用或指針,可以是局部變量,static變量,全域變數。這時候編譯器可能會把這個virtual function優化成普通成員函數inline掉,但是否這麼做取決權在編譯器,不能保證。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:55:32

    理論上這兩者應該是不共存的。但與virtual不同,inline只是編譯器的最佳化建議,編譯器不一定會採納inline這個建议,所以這兩者書寫上並存還是允許的,不過在實際編譯時,inline就不會展開了。
    另外我看到一些訊息,說virtual函數也有可能在編譯時被確定,從而可以實現inline。不過這都是Compiler Dependent,所以也不能絕對的去說。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 14:55:32

    inline不是編譯時展開,是連結時展開。巨集才是預處理時展開。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 14:55:32

    我的建議是大多數情況下直接忽略inline這個關鍵字,因為大多數C++編譯器都是智慧的處理函式內聯,幾百行的成員函式都可以直接內聯,而且如上所說inline只是建議編譯器,並不起絕對的作用。

    回覆
    0
  • 取消回覆