Effective C++ 阅读笔记(一)透彻了解inline以及降低编译依存关系
inline內(nèi)斂
1.類似于C中的#define
在C++中,提供了inline函數(shù)來代替C中的宏定義。(通??梢允褂胏onst來代替單純變量的宏定義,它可以提供類型檢查。對于形似函數(shù)的宏,最好改用inline函數(shù)來替換宏定義。)
編譯器最優(yōu)化機制通常被設(shè)計用來濃縮那些“不含函數(shù)調(diào)用“的代碼,所以當(dāng)你inline某個函數(shù)時,或許編譯器就因此有能力對它執(zhí)行語境相關(guān)最優(yōu)化。
2.效率問題
inline函數(shù)同#define宏定義一樣,都是以函數(shù)本體做替換,這樣做可能增加你的目標(biāo)碼(object code),從而可能造成代碼膨脹(代碼膨脹會導(dǎo)致額外的換頁行為,降低指令高速緩存裝置的擊中率,帶來效率損失)。
如果inline函數(shù)本體很小,編譯器針對“函數(shù)本體”所產(chǎn)生的碼可能比針對“函數(shù)調(diào)用”所產(chǎn)生的碼可能更小。
3.是申請,而不是強制,也不一定要帶inline
注意,inline只是對編譯器的一個申請,不是強制命令。這項申請可以隱喻提出,也可以明確提出:
class person{ public:int age() const { return m_age; } //隱喻提出inline申請 private:int m_age; };4.虛函數(shù)可以inline嗎?
大部分編譯器都回拒絕太復(fù)雜的inline函數(shù),而對所有的virtual虛函數(shù)都不能申請為inline函數(shù),這是因為虛函數(shù)意味著”等待,直到運行期間才能確定調(diào)用哪個函數(shù)“,而inline意味著”執(zhí)行前,先將調(diào)用動作替換為函數(shù)本體“。
5.構(gòu)造函數(shù)和析構(gòu)函數(shù)一般不應(yīng)該是inline的
通常在繼承類中,即使是空的構(gòu)造函數(shù)和析構(gòu)函數(shù),也會調(diào)用基類的構(gòu)造函數(shù)和析構(gòu)函數(shù),如果是多重繼承的話代碼就會更加復(fù)雜。這樣如果再把它設(shè)為inline函數(shù)的話,出現(xiàn)的地方都回替換函數(shù)本體,那代碼量務(wù)必會增加的。
6.templates函數(shù)不一定要inline
templates通常放在頭文件中,編譯器將它具現(xiàn)化才能知道函數(shù)本體的內(nèi)容。inline需要成本,所以要多加考慮,否則可能導(dǎo)致代碼膨脹。
7.程序升級與inline函數(shù)
inline函數(shù)無法隨程序庫的升級而升級,故需要升級的函數(shù)不要采用inline函數(shù)。
假如f是一個inline函數(shù),這時如果把f編進程序中,一旦程序決定修改f函數(shù),所有用到f的客戶端程序都必須重新編譯,這往往是不被接受的。如果是非Inline函數(shù),一旦它有修改升級,程序只需要編譯這部分重新連接就好。
?
降低文件間的編譯依存關(guān)系
C++沒有把接口從實現(xiàn)中分離出來,為了實現(xiàn)接口與實現(xiàn)的分離,要使用聲明式,不要使用定義式?;诖藰?gòu)想的兩個手段是handle classes和interface classes。
int main() {int x;Person p(params); }當(dāng)編譯器看到x的定義式,它知道必須分配多少內(nèi)存才能夠容下一個int。但當(dāng)編議器看到p的定義式,如何知道一個person有多大?唯一的辦法就是詢問class的定義式。然而如果class定義式不列出實現(xiàn)的細節(jié),該怎么辦?
int main () {int x;Person *p; }只定義一個指向Person對象的指針。這里將不需要class的定義式,如果class Person的任何修改都不需要從新編譯這個函數(shù)文件。
也就是說,通過聲明的依賴性替代定義的依賴性,來實現(xiàn)接口與實現(xiàn)的分離。
?
所以需要注意:
如果使用object reference或object pointers能完成的任務(wù),就不要使用object。references 和pointers只依靠類型聲明式,但object就要依靠類型的定義式了。
如果可以,盡量以class聲明式替換class定義式。
?
不知道從何時開始,在這里記筆記已經(jīng)成為了一個習(xí)慣,不記下來總覺得就忘記了
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Effective C++ 阅读笔记(一)透彻了解inline以及降低编译依存关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三国杀有趣的游戏id,三国杀游戏id取名
- 下一篇: Svchost.exe进程详解及Svch