C 中的INLINE(內聯)函式

2021-09-21 02:16:24 字數 1057 閱讀 3121

inline關鍵字僅僅是對編譯器的建議,編譯器有權力決定乙個函式是否在呼叫處嵌入。因為內聯函式要在呼叫處展開,編譯器必須能在每乙個呼叫處能看到該函式的定義,因此最好將函式實現放在標頭檔案中(而且實現在類定義中的成員函式即便不加inline關鍵字也會自動成為內聯函式)。在實現檔案中該函式之前要加上inline關鍵字的方式是有問題的:如果呼叫的obj檔案在函式定義之前生成,那麼該處就無法嵌入內聯函式了。如果普通函式需要成為內聯函式,在定義時加上inline關鍵字。

注意:包含了遞迴、迴圈等結構的函式一般不會被內聯。

虛函式一般不會內聯,但是如果編譯器能在編譯時確定具體的呼叫函式,那麼仍然會就地展開該函式。

如果通過函式指標呼叫內聯函式,那麼該函式將不會內聯而是通過call進行呼叫。

構造和析構函式一般會生成大量**,因此一般也不適合內聯。

如果內聯函式呼叫了其他函式也不會被內聯。

如果想要阻止某函式被內聯,可以在函式體前加上attribute((noinline)) 。 實際上除了上述需要注意的專案,下面這個也同樣重要:

在c++中,內聯函式必須是和函式體申明在一起,才有效。像這樣的申明 inline tablefunction(int i);

是沒有效果的,編譯器只是把函式作為普通的函式申明,我們必須定義函式體。 inline tablefunction(int i)

; 這樣我們才算定義了乙個內聯函式。我們可以把它作為一般的函式一樣呼叫。但是執行速度確比一般函式的執行速度要快。

個人經驗來說:

在c++中,當有多個函式檔案時,內聯函式的定義與宣告必須放在標頭檔案中,在a函式檔案中定義的內聯函式不能在b函式檔案中使用,即使是main函式。

(error:無法解析的外部符號 「bool __cdecl compareisbn(class sales_data const &,class sales_data const &)」 (?compareisbn@@ya_nabvsales_data@@0@z),該符號在函式 _main 中被引用)

這種錯誤在編譯時是發現不了的,當程式執行時才會發生,一定要注意!!!

inline函式 C 內聯函式 inline

inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...

C 中的內聯函式inline

c 中使用內聯函式可以減少函式來回跳轉的次數,有效地提高程式執行的速度。但是假如函式體有很多 但是需要重複呼叫該函式很多次的話,那麼不斷地複製該函式體的 將會造成程式的增大,所以我們需要將函式的宣告和定義分開。c 中編譯器不會建立真正的函式,而只是將這個內聯函式中的所有 拷貝到呼叫函式中。語法 in...

C 中的inline內聯函式

inline 關鍵字可以只在函式定義處新增,也可以只在函式宣告處新增,也可以同時新增 但是在函式宣告處新增 inline 關鍵字是無效的,編譯器會忽略函式宣告處的 inline 關鍵字。也就是說,inline 是一種 用於實現的關鍵字 而不是一種 用於宣告的關鍵字 儘管大多數教科書中在函式宣告和函式...