天天看點

内聯函數和constexpr函數

内聯函數的定義:内聯函數可以避免函數調用時的開銷,内聯函數是将函數傳回值的類型前面加上inline關鍵字,這樣就可以聲明一個内聯函數。

優點:調用函數一般比求等價表達式的值要慢一些。一次函數調用其實包含着一系列工作:調用前要先儲存寄存器,并在傳回時恢複;可能需要拷貝實參;程式轉向一個新的位置繼續執行。

内聯函數可避免函數調用時的開銷,将函數指定為内聯函數,通常就是将它在每個調用點上“内聯地”展開。

内聯聲明隻是向編譯器發出的一個請求,編譯器可以選擇忽略這個請求。

内聯機制用于優化規模較小、流程直接、頻繁調用的函數。很多編譯器不支援内聯遞歸函數。

constexpr:

常量表達式是指值不會改變并且在編譯過程就能得到計算結果的表達式。

constexpr變量:允許将變量聲明為constexpr類型以便由編譯器來驗證變量的值是否是一個常量表達式。聲明為constexpr的變量一定是一個常量,而且必須用常量表達式初始化。

而const對象中,用常量去初始化非常量或者用非常量去初始化常量都是可以的。

int i= 42;
const int ci = i;//正确,i的值被拷貝給了ci
int j = ci;//正确:ci的值被拷貝給了j
           
constexpr int mf = 20;//20是常量表達式
consrexpr int limit  = mf+1;//mf+1是常量表達式
constexpr int sz = size();//隻有當size是一個constexpr函數時才是一條正确的聲明語句
           

constexpr函數:能用于常量表達式的函數。定義constexpr函數的方法的約定:函數的傳回類型及所有形參的類型都得是字面值類型(算術類型、引用、指針,自定義類、IO庫、string類型不屬于字面值類型),而且函數體中必須有且隻有一條return語句。為了能在編譯過程中随時展開,constexpr函數被隐式地指定為内聯函數。

允許constexpr函數不一定傳回常量表達式。

内聯函數和constexpr函數放在頭檔案内

和其他的函數不一樣,内聯函數和constexpr函數可以在程式中多次定義。但是它的多個定義必須是一緻的。

繼續閱讀