Effective C++ --5 实现
上一部分 Effective C++ --4 設(shè)計(jì)與聲明
?
26、盡可能延后變量定義式的出現(xiàn)時(shí)間
?(1)這樣可以增加程序的清晰度并改善程序效率。如定義變量后還未使用遇到return或者拋出異常,這樣未使用卻增加了調(diào)用構(gòu)造析構(gòu)函數(shù)的成本。
27、盡量少做轉(zhuǎn)型動(dòng)作
?(1)使用c++新式轉(zhuǎn)型,而不要是用舊式轉(zhuǎn)性。有四種新式轉(zhuǎn)型:const_cast<T>()、dynamic_cast<T>()、reinterpret_cast<T>()和static_cast<T>()。const_cast將對(duì)象常量性轉(zhuǎn)型;dynamic_cast執(zhí)行安全向下轉(zhuǎn)型;reinterpret_cast執(zhí)行低級(jí)轉(zhuǎn)型;static_cast強(qiáng)迫隱式轉(zhuǎn)型。
?(2)盡量避免轉(zhuǎn)型,特別是在注重效率的代碼中避免dynamic_cast。
?(3)如果轉(zhuǎn)型是必要的,試著將它隱藏于某個(gè)函數(shù)背后。客戶(hù)隨后可以調(diào)用該函數(shù),而不需將轉(zhuǎn)型放進(jìn)他們自己的代碼內(nèi)。
28、避免返回handles指向?qū)ο髢?nèi)部
?(1)handles(號(hào)碼牌,用來(lái)取得某個(gè)對(duì)象),reference、指針和迭代器都是,而返回一個(gè)代表對(duì)象內(nèi)部數(shù)據(jù)的handle,但會(huì)降低對(duì)象封裝性。
?(2)避免返回handles指向?qū)ο髢?nèi)部。遵守這個(gè)條款可以增加封裝性,幫助const成員函數(shù)的行為像個(gè)const,并將發(fā)生虛掉號(hào)碼牌的可能性降低。
29、為異常安全而努力是值得的
?(1)異常安全函數(shù)即使發(fā)生異常也不會(huì)泄露資源或允許任何數(shù)據(jù)結(jié)構(gòu)敗壞。可以提供的保證分為三種:基本承諾、強(qiáng)烈保證和不拋擲保證。基本保證,保證異常被拋出后所有對(duì)象都處于前后一致的狀態(tài),但是現(xiàn)實(shí)狀態(tài)不能保證;強(qiáng)烈保證,如果異常拋出,程序狀態(tài)不改變,如果成功,則完全成功,如果失敗就回到調(diào)用函數(shù)之前的狀態(tài);不拋擲異常,總能完成原來(lái)承諾的功能。
?(2)強(qiáng)烈保證,往往能夠以copy-and-swap實(shí)現(xiàn)出來(lái),但是并非對(duì)所有函數(shù)都可實(shí)現(xiàn)或者具備現(xiàn)實(shí)意義。Copy-and-swap原則:為打算修改的對(duì)象(原件)做出一份副本,然后在那份副本上做一切必要修改,若有任何修改動(dòng)作拋出異常,原對(duì)象仍然保持為改變狀態(tài);待所有改變都成功后,再將修改過(guò)的那個(gè)副本和原對(duì)象在一個(gè)不拋出異常的操作中置換。
(3)函數(shù)提供的異常安全保證通常最高只等于其調(diào)用之各個(gè)函數(shù)的異常安全保證中的最弱者。
30、透徹理解inlining的里里外外
?(1)將大多數(shù)inline限制在小型、被頻繁調(diào)用的函數(shù)身上。
?(2)不要太熱衷inline函數(shù),inline函數(shù)是對(duì)每個(gè)函數(shù)都以函數(shù)本體替換之,會(huì)造成代碼膨脹,也會(huì)導(dǎo)致額外的換頁(yè)行為,降低指令高速緩存裝置的擊中率,以及伴隨而來(lái)的效率損失。
?(3)inline只是對(duì)編譯器的一個(gè)申請(qǐng),不是強(qiáng)制命令。這項(xiàng)申請(qǐng)可以隱喻也可以明確提出。如果成員函數(shù)或者friend函數(shù)定義于class內(nèi),則被隱喻為inline;template的具現(xiàn)化與inlining無(wú)關(guān),如果不是具現(xiàn)的每個(gè)函數(shù)都是inline,則應(yīng)避免將template聲明為inline;大部分編譯器拒絕將太過(guò)復(fù)雜的函數(shù)inline,對(duì)所有對(duì)virtual函數(shù)的調(diào)用也都會(huì)使inlining落空。
31、將文件間的編譯依存關(guān)系降至最低
?(1)支持“編譯依存性最小化”的一般構(gòu)想是:相依于聲明式,不要相依于定義式。基于此構(gòu)想的兩個(gè)手段是Handle classes和interface classes。
?(2)pimpl idiom手法(pimpl -- pointer to implementation),將所有“隸屬對(duì)象的數(shù)據(jù)”從原對(duì)象放進(jìn)另一個(gè)對(duì)象,然后賦予對(duì)象一個(gè)指針,指向那個(gè)所謂的實(shí)現(xiàn)對(duì)象。
?(3)程序庫(kù)頭文件應(yīng)該以“完全且僅有聲明式”的形式存在,不管有無(wú)template都適用。
總結(jié)
以上是生活随笔為你收集整理的Effective C++ --5 实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Effective C++ --4 设计
- 下一篇: Effective C++ --6 继承