欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11中內(nèi)聯(lián)函數(shù)(inline)用法實例

 更新時間:2022年10月31日 15:59:13   作者:BUG_C++  
內(nèi)聯(lián)函數(shù)本質還是一個函數(shù),但在聲明的時候,函數(shù)體要和聲明結合在一起,否則編譯器將它作為普通函數(shù)來對待,下面這篇文章主要給大家介紹了關于C++11中內(nèi)聯(lián)函數(shù)(inline)的相關資料,需要的朋友可以參考下

inline 是什么?

inline是C++ 11引入的關鍵字,在函數(shù)聲明or定義時,返回類型前加上關鍵字inline,即可以把函數(shù)指定為內(nèi)聯(lián)函數(shù)。

引入inline的目的是什么?

目的是解決一些頻繁調(diào)用的函數(shù)大量消耗??臻g(棧內(nèi)存)的問題。另一方面用于替換C語言的宏(相比較宏是無法在進行類型檢查)

內(nèi)聯(lián)函數(shù)的特點

  • 內(nèi)聯(lián)函數(shù)的函數(shù)內(nèi)容本質上是寫在調(diào)用內(nèi)聯(lián)函數(shù)的地方;
  • 內(nèi)聯(lián)函數(shù)本質上沒有入棧出棧的開銷;
  • 和宏定義相比,內(nèi)聯(lián)函數(shù)更加安全,編譯器會根據(jù)函數(shù)的要求進行嚴格的類型和作用域檢查,保證調(diào)用無誤;
  • 內(nèi)聯(lián)函數(shù)一般上不包含循環(huán)、遞歸、switch或較長的代碼 等復雜操作;
  • 類聲明中定義的函數(shù),除虛函數(shù)外的其他函數(shù)都會自動隱式地當成內(nèi)聯(lián)函數(shù);

內(nèi)聯(lián)函數(shù)的寫法

這里的一個關鍵點,inline必須與函數(shù)定義放在一起才能使函數(shù)成為內(nèi)聯(lián)函數(shù),僅將inline放在函數(shù)聲明前面不起任何作用。

inline是一種“用于實現(xiàn)”的關鍵字,不是一種“用于聲明”的關鍵字。

//在頭文件中可以進行顯示聲明

//方式1 加 inline(建議使用)
inline int TestFunc(int a, int b);

//方式2 原始常見聲明方式
int TestFunc(int a, int b);

//在源文件中定義
//正確
inline int TestFunc(int a, int b){
    //do something
    return 0;
}
//錯誤
int TestFunc(int a, int b){
    //do something
    return 0;
}

隱式內(nèi)聯(lián)和顯式內(nèi)聯(lián)

隱式內(nèi)聯(lián)的寫法

class CppObj {
    int TestFuncA() { return 0; }       //隱式內(nèi)聯(lián)
    vitrual int TestFuncB() { return 0; }    //虛函數(shù)不會進行隱式內(nèi)聯(lián)   
}

顯式內(nèi)聯(lián)的寫法

class CppObj {
    int TestFuncA();
    inline int TestFuncB();
    vitrual int TestFuncC();
}
inline int CppObj::TestFuncA() {   //顯式內(nèi)聯(lián)
    return 0; 
} 

inline int CppObj::TestFuncB() {   //顯式內(nèi)聯(lián)
    return 0; 
} 

inline 函數(shù)的編譯器處理

inline函數(shù)僅僅是一個開發(fā)者對編譯器的建議,至于最后能否真正內(nèi)聯(lián),需要看編譯器的意思。如果編譯器判定函數(shù)不復雜,能在調(diào)用點展開,就會真正內(nèi)聯(lián)。

內(nèi)聯(lián)函數(shù)優(yōu)缺點

  • 優(yōu)點
    • 內(nèi)聯(lián)函數(shù)相比宏函數(shù)來說,在代碼調(diào)用時會做安全檢查和類型轉換(同普通函數(shù)),而宏定義則不會;
    • 宏定義不可以在運行時可調(diào)試,但內(nèi)聯(lián)函數(shù)可以;
    • 內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣會在被調(diào)用處進行展開,無需參數(shù)壓棧、棧幀開辟與回收,結果返回等,從而能提高代碼的運行速度。
  • 缺點
    • 代碼膨脹。內(nèi)聯(lián)是以代碼膨脹(復制)為代價,是典型的以空間換時間的做法。
    • 內(nèi)聯(lián)函數(shù)不可控。內(nèi)聯(lián)函數(shù)只是編碼者對編譯器的建議,是否對函數(shù)內(nèi)聯(lián),最終決定權在于編譯器。
    • inline 函數(shù)無法隨著函數(shù)庫升級而升級。inline函數(shù)的改變需要重新編譯,不像 non-inline 可以直接鏈接。

虛函數(shù)可以是內(nèi)聯(lián)函數(shù)嗎?

  • 虛函數(shù)可以是內(nèi)聯(lián)函數(shù);
  • inline是可以修飾虛函數(shù);

虛函數(shù)內(nèi)聯(lián)條件?

可以內(nèi)聯(lián)的條件,編譯器具有實際對象而不是對象的指針或引用時才會,所以當虛函數(shù)表現(xiàn)多態(tài)性的時候不能內(nèi)聯(lián)。

虛函數(shù)表現(xiàn)多態(tài)性的時候不能內(nèi)聯(lián)

內(nèi)聯(lián)是在編譯期進行的,但虛函數(shù)的多態(tài)性在運行期,所以編譯器無法知曉運行期具體調(diào)用哪個代碼

代碼釋義

#include <iostream>
using namespace std;
class Base {
public:
	virtual ~Base() {}
	inline virtual void FuncName() { cout << "this is Base " << endl; }
};

class Derived : public Base {
public:
	inline virtual void FuncName() { cout << "this is Derived" << endl; }
};

int main()
{
	// 編譯器具有實際對象,所以它可以是內(nèi)聯(lián)的.
	Base b;
	b.FuncName();

	// 編譯器具有對象的指針,呈現(xiàn)多態(tài)性,運行時期才能確定,所以不能內(nèi)聯(lián)。
	Base* p = new Derived();
	p->FuncName();

	delete p;
	p = nullptr;

	system("pause");
	return 0;
}

參考連接:

Are “inline virtual” member functions ever actually “inlined”?

總結 

到此這篇關于C++11中內(nèi)聯(lián)函數(shù)(inline)用法的文章就介紹到這了,更多相關C++11內(nèi)聯(lián)函數(shù)inline內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言中pthread_exit()函數(shù)實現(xiàn)終止線程

    C語言中pthread_exit()函數(shù)實現(xiàn)終止線程

    本文主要介紹了C語言中pthread_exit()函數(shù)實現(xiàn)終止線程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • C++獲取zip文件列表方法

    C++獲取zip文件列表方法

    本文將介紹獲取zip文件列表的方法,有些新手的朋友可以參考下
    2012-12-12
  • C語言實現(xiàn)商品管理系統(tǒng)開發(fā)

    C語言實現(xiàn)商品管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)商品管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言調(diào)用SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)增刪改查

    C語言調(diào)用SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)增刪改查

    SQLite是一種輕量級的關系型數(shù)據(jù)庫管理系統(tǒng),是一個開源的、零配置的、服務器端的、自包含的、零管理的、事務性的SQL數(shù)據(jù)庫引擎,本文主要介紹了如何調(diào)用SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)增刪改查,需要的可以參考一下
    2023-08-08
  • 判斷指定的進程或程序是否存在方法小結(vc等)

    判斷指定的進程或程序是否存在方法小結(vc等)

    VC判斷進程是否存在?比如我想知道記事本是否運行,要用到哪些函數(shù)等實例,需要的朋友可以參考下
    2013-01-01
  • C++中vector迭代器失效問題詳解

    C++中vector迭代器失效問題詳解

    vector是向量類型,它可以容納許多類型的數(shù)據(jù),如若干個整數(shù),所以稱其為容器,這篇文章主要給大家介紹了關于C++中vector迭代器失效問題的相關資料,需要的朋友可以參考下
    2021-11-11
  • C語言指針應用簡單實例

    C語言指針應用簡單實例

    這篇文章主要介紹了C語言指針應用簡單實例的相關資料,需要的朋友可以參考下
    2017-05-05
  • Qt利用QDrag實現(xiàn)拖拽拼圖功能詳解

    Qt利用QDrag實現(xiàn)拖拽拼圖功能詳解

    QDrag類為MIME-based拖拽數(shù)據(jù)轉換提供支持。本文為大家主要介紹如何利用QDrag類實現(xiàn)拖拽拼圖功能。左邊是打散的圖,拖動到右邊進行復現(xiàn),此外程序還支持手動拖入原圖片,感興趣的可以了解一下
    2022-07-07
  • C++中POCO庫的安裝與基礎知識介紹(Windwos和Linux)

    C++中POCO庫的安裝與基礎知識介紹(Windwos和Linux)

    這篇文章主要為大家介紹了C++ POCO庫的簡單介紹、下載以及安裝方式、簡單代碼示例,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-05-05
  • 詳解C++11中的類型推斷

    詳解C++11中的類型推斷

    C++11中為了更好的支持泛型編程,提供了?auto和decltype兩個關鍵詞,目的就是提供編譯階段的自動類型推導,這篇文章主要介紹了C++11中的類型推斷,需要的朋友可以參考下
    2023-01-01

最新評論