C++的优秀特性2:inline 函数
(轉(zhuǎn)載請(qǐng)注明原創(chuàng)于潘多拉盒子)
Inline函數(shù)是C++的一個(gè)很小的特性,在不計(jì)較效率的情況下,這個(gè)特性似乎可有可無(wú)。然而,C++天生是為最為廣泛的應(yīng)用場(chǎng)景設(shè)計(jì)的,因此,總會(huì)有關(guān)于效率的問(wèn)題。其實(shí),除了效率,inline函數(shù)還提供了另外一個(gè)便利:可讀性。當(dāng)一個(gè)函數(shù)比較小,比如只有一個(gè)return語(yǔ)句,那么把實(shí)現(xiàn)和聲明分開(kāi)不是一個(gè)很好的辦法。比如如下的一個(gè)成員函數(shù):
class List { public:size_t getSize() const{return _size;} private:size_t _size; };如果將其中的getSize()函數(shù)的實(shí)現(xiàn)放在cpp文件中,則大大的不美:對(duì)于一個(gè)讀者來(lái)讀這個(gè)函數(shù),可以在第一時(shí)間了解該函數(shù)的功能。效率也很高,幾乎是訪問(wèn)成員變量一樣的效率。
一個(gè)函數(shù)是否inline跟這個(gè)函數(shù)聲明時(shí)是否使用inline關(guān)鍵字沒(méi)有關(guān)系,比如這個(gè)inline函數(shù)雖然沒(méi)使用inline關(guān)鍵字來(lái)聲明,但卻是inline的。反之,使用inline函數(shù)聲明,則不一定是inline的,比如該函數(shù)的定義如果放在cpp文件中,則不是inline的。
使用inline來(lái)聲明并在別處定義的inline函數(shù),必須實(shí)在h文件中定義的:這很容易理解,因?yàn)閕nline是編譯時(shí)行為,編譯器需要將代碼展開(kāi)放在調(diào)用者代碼中,因此編譯器需要在h文件中看到定義。比如下面的例子:
class List { public:size_t getSize() const; private:size_t _size; };inline size_t List::getSize() const {return _size; }其中的getSize()就是一個(gè)inline函數(shù)。但如果變成:
class List { public:inline size_t getSize() const private:size_t _size; };// in cpp size_t List::getSize() const {return _size; }雖然在聲明時(shí)使用了inline關(guān)鍵字,但定義卻放在了cpp文件中,因此不是inline函數(shù)。
雖然inline函數(shù)可以直接在聲明處就地定義,也可以用inline關(guān)鍵字聲明,再用inline關(guān)鍵字在h文件中定義,但是,出于以下的原因,建議在h文件中聲明處就地定義。
原則:
1. inline函數(shù)的行數(shù)要很小,最好小于3行。因?yàn)槿绻鹖nline函數(shù)很大, 那么調(diào)用的開(kāi)銷相對(duì)于執(zhí)行的開(kāi)銷,就顯得沒(méi)那么大了,沒(méi)必要inline。從可讀性上來(lái)考慮,臺(tái)大的函數(shù)實(shí)現(xiàn)會(huì)干擾可讀性。
筆者看到過(guò)很大的函數(shù),還用inline來(lái)實(shí)現(xiàn),實(shí)在是沒(méi)有必要,而且畫(huà)蛇添足了。
建議:
1. 構(gòu)造函數(shù)、析構(gòu)函數(shù),使用inline來(lái)實(shí)現(xiàn)。可讀性、效率需求。
2. 簡(jiǎn)單的get、set函數(shù),使用inline來(lái)實(shí)現(xiàn)。可讀性、效率需求。
3. 頻繁調(diào)用的小函數(shù),使用inline來(lái)實(shí)現(xiàn)。主要是效率需求。
Inline函數(shù)是個(gè)很常用的功能,但是也不能濫用。
?
轉(zhuǎn)載于:https://www.cnblogs.com/bqzhao/p/3538074.html
總結(jié)
以上是生活随笔為你收集整理的C++的优秀特性2:inline 函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TCP/IP 笔记一
- 下一篇: s3c2440移植MQTT