Effective C 第五章 實現 下

2021-08-21 03:04:43 字數 1849 閱讀 4368

當異常丟擲時,帶有異常安全的函式會:

異常安全函式提供以下三個保證之一:

copy and swap會導致強烈保證。原則是為你打算修改的物件(原件)做出乙份副本,然後在那副本身上做一切必要修改。若有任何修改動作丟擲異常,原物件仍保持未改變狀態。待所有改變都成功後,再將修改過的那個副本和原物件在乙個不丟擲異常的操作中置換(swap)。

請記住:

inline函式,看起來像函式,比巨集好得多,可以呼叫它們又不需蒙受函式呼叫所招致的額外開銷。

inline函式背後整體的整體觀念是,將「對此函式的每乙個呼叫」都以函式本體替換之。這樣做可能增加目標碼的大小。在一台記憶體有限的的機器上,過度熱衷inlining會造成程式體積太大,即使有虛擬記憶體,inline造成的**膨脹也會導致額外換頁行為,降低指令快取記憶體裝置的擊中率,以及伴隨這些而來的效率損失。

inline只是對編譯器的乙個申請,不是強制指令。這項申請可以隱喻提出,也可以明確提出。隱喻方式是將函式定義於class定義式內:

class

person //隱喻申請

... private:

inttheage

};

這樣的函式通常是成員函式,friend函式也可被定義於class內,如果真是那樣,它們也是被隱喻宣告為inline。

明確宣告inline函式的做法則是在其定義式錢加上關鍵字inline。例如標準的max template:

template

<

typename

t>

inline

constt&

std::max(constt&

a, constt&

b)

大部分編譯器拒絕將過於複雜(例如帶有迴圈或遞迴)的函式inlining,而所有對虛函式的呼叫也都會使inlining落空。因為虛函式直到執行期才確定呼叫哪個函式,而內聯函式意味執行前先將呼叫動作替換為被呼叫函式的本體。

乙個表面上看似inline的函式是否真是inline,取決於你的建置環境,主要取決於編譯器。編譯器通常不對「通過函式指標而進行的呼叫」實施inlining。

建構函式和析構函式往往是inlining的糟糕候選人。(由編譯器於編譯期代為產生並安插在程式中的**,可能存在於建構函式和析構函式中)。

程式庫設計者必須評估「將函式宣告為inline」的衝擊:inline函式無法隨著程式庫的公升級而公升級。例如f是程式庫內的乙個inline函式,客戶將「f函式本體」編進其程式中,一旦程式庫設計者決定改變f,所有用到f的客戶端程式必須重新編譯。但如果f是non-inline函式,客戶端只需重新連線即可;如果是動態鏈結庫,公升級版函式甚至可以不知不覺地被應用程式吸納。

大部分偵錯程式面對inline函式都束手無策,因為你不能在乙個不存在的函式內設立斷點。

請記住:

如果沒有取得其實現**所用到的class string,date和address的定義式,那麼class person無法通過編譯。

class

person;

所以person定義檔案的最上方可能存在:

#include

#include"date.h"

#include"address.h"

這麼一來使得person定義檔案和其含入檔案之間形成了一種編譯依賴關係。如果這些標頭檔案中有任何乙個被改變,或者這些標頭檔案依賴的其他標頭檔案有任何改變,那麼每乙個含入person class的檔案就得重新編譯,任何使用person class的檔案也必須重新編譯。

handle classes可以解除介面和實現之間的耦合關係,從而降低檔案間的編譯依存性。

解除介面和實現之間的耦合關係,從而降低檔案間的編譯依存性的方法還有inte***ce classes。

請記住:

python第五章 Python學習(第五章)

記錄所有的名片字典 card list defshow menu 顯示資訊 print 50 print 歡迎使用 名片管理系統 v1.0 print print 1.新增名片 print 2.顯示全部 print 3.搜尋名片 print print 0.退出系統 print 50 defnew ...

第五章 雜湊

雜湊表adt,只支援二叉樹查詢所允許的一部分操作。比如插入,刪除,查詢等。那些需要元素間排序資訊的操作將不會得到支援。比如findmin,findmax和線性時間按排序順序列印整個表的操作時不支援的。雜湊函式在理想狀態是能將任何兩個不同的關鍵字對映到不同的單元,但是這是不可能,因為關鍵字是無窮的,但...

第五章 函式

第五章 函式 1 函式的定義 shell函式定義可以放在 bash profile 檔案中,也可以在使用該函式的指令碼中,還可以在命令列中 通過 source 或 執行bash profile檔案,使修改能夠立即生效 function 函式名 declare f 顯示定義的函式清單 export f...