內聯函數和編譯器:
內聯函數并不是何時何地都有效,為了理解內聯函數何時有效,應該要知道編譯器碰到內聯
函數會怎么處理?
對于任何類型的函數,編譯器會將函數類型(包括函數名字,參數類型,返回值類型)放入到
符號表中。同樣,當編譯器看到內聯函數,并且對內聯函數體進行分析沒有發現錯誤時,也
會將內聯函數放入符號表。
當調用一個內聯函數的時候,編譯器首先確保傳入參數類型是正確匹配的,或者如果類型不
正完全匹配,但是可以將其轉換為正確類型,并且返回值在目標表達式里匹配正確類型,或
者可以轉換為目標類型,內聯函數就會直接替換函數調用,這就消除了函數調用的開銷。假
如內聯函數是成員函數,對象this指針也會被放入合適位置。
類型檢查和類型轉換、包括在合適位置放入對象this指針這些都是預處理器不能完成的。
但是c++內聯編譯會有一些限制,以下情況編譯器可能考慮不會將函數進行內聯編譯:
不能存在任何形式的循環語句
不能存在過多的條件判斷語句
函數體不能過于龐大
不能對函數進行取址操作
內聯僅僅只是給編譯器一個建議,編譯器不一定會接受這種建議,如果你沒有將函數聲明為
內聯函數,那么編譯器也可能將此函數做內聯編譯。一個好的編譯器將會內聯小的、簡單的
函數。
?