C++淺析內(nèi)聯(lián)函數(shù)的使用
一. 概念
以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時C++編譯器會在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷, 內(nèi)聯(lián)函數(shù)提升程序運行的效率。
在C++里為了提高效率使用內(nèi)聯(lián)函數(shù),可是我們會發(fā)現(xiàn)在C語言里面已經(jīng)有了宏,也可以處理關(guān)于這個效率的問題,那為什么還會出現(xiàn)內(nèi)聯(lián)函數(shù)呢?
當我們要寫一個Add的宏時:
#define Add(x, y) ((x) + (y))
但是也有人可能會寫錯,出現(xiàn)下面這些情況,比如:
#define Add(x, y) return x + y ; #define Add(x, y) return (x + y); #define Add(x, y) return (x + y) #define Add(x, y) x + y #define Add(x, y) x + y; #define Add(x, y) (x + y); #define Add(x, y) (x + y)
以上這些都是有可能會出現(xiàn)的情況,既然這么容易寫錯,于是乎C++就出現(xiàn)了內(nèi)聯(lián)函數(shù),就是為了解決宏函數(shù)晦澀難懂,容易寫錯的問題
那么如何查看內(nèi)聯(lián)函數(shù)呢?
我們知道宏是不支持調(diào)試的,但是內(nèi)聯(lián)函數(shù)是支持調(diào)試的,那內(nèi)聯(lián)函數(shù)怎么支持調(diào)試的呢?其實內(nèi)聯(lián)函數(shù)在debug版本下是不會展開的,如圖:
但是release版本下又看不到匯編代碼,為了能查看內(nèi)聯(lián)函數(shù),我們需要更改一些設(shè)置提高優(yōu)化等級,在debug模式下,需要對編譯器進行設(shè)置,否則不會展開,因為debug模式下,編譯器默認不會對代碼進行優(yōu)化,以下給出vs2019的設(shè)置方式,如下圖:(這里由于疏忽忘記在函數(shù)前加上inline,記得加上并重新編譯以后在調(diào)試狀態(tài)下轉(zhuǎn)到反匯編查看)
這些配置好了以后再次查看匯編代碼:
我們就會發(fā)現(xiàn)這里不再call函數(shù)了,說明沒有建立函數(shù)棧幀,而是直接展開了,inline起作用了這里
二. 特性
- inline是一種以空間換時間的做法,省去調(diào)用函數(shù)額開銷(建立棧幀)。所以代碼很長或者有循環(huán)/遞歸的函數(shù)不適宜使用作為內(nèi)聯(lián)函數(shù)。(一般十行左右的代碼使用)
- inline對于編譯器而言只是一個建議,編譯器會自動優(yōu)化,如果定義為inline的函數(shù)體內(nèi)有循環(huán)/遞歸或者代碼太長等等,編譯器優(yōu)化時會忽略掉內(nèi)聯(lián)。
- inline不建議聲明和定義分離,分離會導(dǎo)致鏈接錯誤。因為inline被展開,就沒有函數(shù)地址了,鏈接就會找不到。
聲明和定義分離以后會報鏈接錯誤:
回顧:
宏的優(yōu)缺點?
優(yōu)點:
1.增強代碼的復(fù)用性。
2.提高性能。
缺點:
1.不方便調(diào)試宏。(因為預(yù)編譯階段進行了替換)
2.導(dǎo)致代碼可讀性差,可維護性差,容易誤用。
3.沒有類型安全的檢查 。
擴展:
C++有哪些技術(shù)替代宏?
1. 常量定義 換用const
2. 函數(shù)定義 換用內(nèi)聯(lián)函數(shù)
到此這篇關(guān)于C++淺析內(nèi)聯(lián)函數(shù)的使用的文章就介紹到這了,更多相關(guān)C++內(nèi)聯(lián)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!