日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Effective C++ 阅读笔记(一)透彻了解inline以及降低编译依存关系

發(fā)布時間:2023/12/31 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective C++ 阅读笔记(一)透彻了解inline以及降低编译依存关系 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。