Effective C 讀書筆記 30

2021-06-16 19:44:54 字數 970 閱讀 5816

條款30:透徹了解inline函式的裡裡外外

inline函式是直接將函式呼叫用函式的本體來替換,這樣就免去了函式呼叫時候的消耗,但是由於每次對於函式的呼叫都

會用函式的本體來替換,因此過度的應用inline函式會對程式的**造成膨脹,會造成指令緩衝的命中率,因此我們在應用inline

函式的時候也一定要把握好度!

看下面的例子:

class base

~base()

...private:

string strp;

string strq;

};class derive:public base

~derive()

string getp()

...public:

string drivep

string driveq;

};

在例子中我們對於getp成員函式在類定義的時候定義的,此時函式就是隱式的inline函式,該函式比較短小,適合作為

inline函式,同樣的對於drive類的建構函式中,雖然我們具體的實現**比較小,但是對於類的建構函式和析構函式,編譯器都

替我們做了很多的事情,在這裡我們能夠看到在drived的建構函式中會包含base的建構函式,還有其成員變數的建構函式,包括父

類的,在這裡就是四個string的建構函式,此外在建構函式中,還包含一些異常判斷的**,這樣其實看起來基本沒有**的構造函

數其實編譯器給實現了很多內部的操作,這樣建構函式其實就不適合作為inline函式了,對於析構函式也是一樣的,因此是否將函式

設定為inline函式需要慎重的考慮的!此外由於inline函式是直接對程式對函式的呼叫進行替換的,因此不適合程式的除錯,不過編譯

器可以對inline後的**進行**的優化!

請記住:

Effective C 讀書筆記3

條款8 別讓異常逃離析構函式 c 並不禁止析構函式吐出異常,但不鼓勵這樣做。但如果你的析構函式必須執行乙個動作,而該動作可能會在失敗時丟擲異常,該怎麼辦?兩個辦法解決 一是 如果丟擲異常程式就結束,通常通過呼叫abort函式完成 dbconn dbconn catch 如果程式遭遇乙個於析構期間發生...

effective C 讀書筆記 3

1 p18 頁 經過我的實驗 void f1 const a a 和void f2 a const a 是不同的!莫非書上有錯?2 stl迭代器 天生就是 t const ptr 如果需要乙個 const t ptr 則需要的是 const iterator 3 這個表要記一下子 3 non con...

《effective C 》讀書筆記

1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...