C++11中內(nèi)聯(lián)函數(shù)(inline)用法實例
inline 是什么?
inline是C++ 11引入的關鍵字,在函數(shù)聲明or定義時,返回類型前加上關鍵字inline,即可以把函數(shù)指定為內(nèi)聯(lián)函數(shù)。
引入inline的目的是什么?
目的是解決一些頻繁調用的函數(shù)大量消耗??臻g(棧內(nèi)存)的問題。另一方面用于替換C語言的宏(相比較宏是無法在進行類型檢查)
內(nèi)聯(lián)函數(shù)的特點
- 內(nèi)聯(lián)函數(shù)的函數(shù)內(nèi)容本質上是寫在調用內(nèi)聯(lián)函數(shù)的地方;
- 內(nèi)聯(lián)函數(shù)本質上沒有入棧出棧的開銷;
- 和宏定義相比,內(nèi)聯(lián)函數(shù)更加安全,編譯器會根據(jù)函數(shù)的要求進行嚴格的類型和作用域檢查,保證調用無誤;
- 內(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ù)不復雜,能在調用點展開,就會真正內(nèi)聯(lián)。
內(nèi)聯(lián)函數(shù)優(yōu)缺點
- 優(yōu)點
- 內(nèi)聯(lián)函數(shù)相比宏函數(shù)來說,在代碼調用時會做安全檢查和類型轉換(同普通函數(shù)),而宏定義則不會;
- 宏定義不可以在運行時可調試,但內(nèi)聯(lián)函數(shù)可以;
- 內(nèi)聯(lián)函數(shù)同宏函數(shù)一樣會在被調用處進行展開,無需參數(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)性在運行期,所以編譯器無法知曉運行期具體調用哪個代碼
代碼釋義
#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++實現(xiàn)LeetCode(53.最大子數(shù)組)
這篇文章主要介紹了C++實現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

