青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Shuffy

不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19
【轉(zhuǎn)】http://m.shnenglu.com/tiandejian/archive/2007/08/19/EC_26.html

第五章.        實(shí)現(xiàn)

在大多數(shù)情況下,恰當(dāng)?shù)刈龊妙悾ㄒ约邦惸0澹┑亩x和函數(shù)(以及函數(shù)模板)的聲明是整個(gè)實(shí)現(xiàn)工作的重中之重。一旦你順利地完成了這些工作,那么相關(guān)的實(shí)現(xiàn)工作大都是直截了當(dāng)?shù)摹H欢@里還存在一些需要關(guān)注的事情:過早地定義變量可能會犧牲性能。濫用轉(zhuǎn)型可能會使代碼變得笨重且不以維護(hù),同時(shí)也會困擾于無盡難于發(fā)現(xiàn)的 bug 。返回一個(gè)對象內(nèi)部內(nèi)容的句柄會破壞代碼的封裝性,同時(shí)留給客戶端程序員一個(gè)懸而未決的“野句柄”。如果對異常的影響考慮不周,那么將會帶來資源泄露和數(shù)據(jù)結(jié)構(gòu)的破壞。過分熱衷于使用內(nèi)聯(lián)會使代碼不斷膨脹。代碼文件過多過復(fù)雜會造成的過于復(fù)雜的耦合,程序的構(gòu)建時(shí)間會漫長得讓人無法忍受。

所有這些問題都是可以避免的。本章就來講解如何去做。


 

 

第26條:     定義變量的時(shí)機(jī)越晚越好

你經(jīng)常要使用構(gòu)造函數(shù)或者析構(gòu)函數(shù)來定義某個(gè)類型的一個(gè)變量,當(dāng)系統(tǒng)控制在接收到這一變量的定義時(shí),就引入了一次構(gòu)造過程的開銷;在變量達(dá)到自身作用域以外時(shí),就引入一次析構(gòu)過程的開銷。未使用的變量也會帶來一定的開銷,所以你應(yīng)該盡可能的避免這種浪費(fèi)的出現(xiàn)。

你可能會想你永遠(yuǎn)也不會定義變量而不去使用,但是你可能需要三思而后行。請觀察下邊的函數(shù),它在所提供的密碼足夠長時(shí),可以返回一個(gè)加密版本的密碼。如果密碼長度過短,函數(shù)就會拋出一 個(gè) logic_error 型的異常(這個(gè)異常類型定義于標(biāo)準(zhǔn) C++ 庫中,參見第 54 條):

// 這個(gè)函數(shù)定義 "encrypted" 變量的時(shí)機(jī)過早

std::string encryptPassword(const std::string& password)

{

 using namespace std;

 

 string encrypted;

 

 if (password.length() < MinimumPasswordLength) {

     throw logic_error("Password is too short");

 }

 ...                            // 對密碼加密

 return encrypted;

}

本函數(shù)中,對象 encrypted 并不是完全未使用的,但是在拋出異常的情況下,函數(shù)就不會使用它。也就是說,即使 encryptPassword 拋出一個(gè)異常的話,你也要為 encrypted 付出一次構(gòu)造和一次析構(gòu)的代價(jià)。因此,你最好這樣做:推遲 encrypted 的定義,直到你確認(rèn)你需要它時(shí)再進(jìn)行

// 這個(gè)函數(shù)推遲了 encrypted 的定義,直到真正需要它時(shí)再進(jìn)行

std::string encryptPassword(const std::string& password)

{

 using namespace std;

 

 if (password.length() < MinimumPasswordLength) {

     throw logic_error("Password is too short");

 }

 

 string encrypted;

 

 ...                            // 對密碼加密

 return encrypted;

}

上面的代碼還不像你想象的那么嚴(yán)謹(jǐn),這是因?yàn)樵诙x encrypted 是沒有為它設(shè)置任何初始化參數(shù)。這就意味著編譯器將調(diào)用它的默認(rèn)構(gòu)造函數(shù)。通常情況下,你要對一個(gè)對象需要做的第一件事就是為它賦一個(gè)值,通常是通過一次賦值操作。第 4 條中解釋了為什么使用默認(rèn)構(gòu)造函數(shù)構(gòu)造對象并為其賦值,要比使用需要的值對其進(jìn)行初始化的效率低一些。那里的分析符合此處的情況。比如說,可以假設(shè)的較困難的部分是通過下面的函數(shù)來解決的:

void encrypt(std::string& s);             // encrypts s in place

encryptPassword 就應(yīng)該以下面的方式來實(shí)現(xiàn)了,盡管它不是最優(yōu)秀的:

// 這一函數(shù)推遲了 enctypted 定義的時(shí)機(jī),直到需要時(shí)才進(jìn)行。

// 但仍然會帶來不必要的效率問題。

 

std::string encryptPassword(const std::string& password)

{

 ...                            // 同上,檢查密碼長度

 

 std::string encrypted;         // encrypted 的默認(rèn)構(gòu)造函數(shù)版本

 encrypted = password;           // encrypted 賦值

 

 encrypt(encrypted);

 return encrypted;

}

更好的一種實(shí)現(xiàn)方式是,使用 password 來初始化 encrypted ,這樣就可以跳過默認(rèn)構(gòu)造過程所帶來的無謂的性能開銷:

// 最后給出定義和初始化 encrypted 的最佳方法

 

std::string encryptPassword(const std::string& password)

{

 ...                              // 檢查長度

 

 std::string encrypted(password);// 通過拷貝構(gòu)造函數(shù)定義和初始化

 

 encrypt(encrypted);

 return encrypted;

}

此時(shí)標(biāo)題中 的“越 越好”的含義就十分明顯了。你不僅僅要推遲一個(gè)變量的定義時(shí)機(jī),直到需要它時(shí)再進(jìn)行;你還需要繼續(xù)推遲,直至你掌握了它的初始化參數(shù)為止。這樣做,你就可以避免去構(gòu)造和析構(gòu)不必要的對象,你也可以避免那些無關(guān)緊要的默認(rèn)構(gòu)造過程。還有,通過初始化這些變量,定義這些變量的目的一目了然,從而代碼也變得更加清晰。

“但是循環(huán)呢?”你可 能會想。如果一個(gè)變量僅僅在循環(huán)題中使用,那么更好的選擇是:將它定義在循環(huán)題的外部,在每次循環(huán)迭代前對其進(jìn)行賦值;還是:在循環(huán)體的內(nèi)部定義變量?也就是說,哪種基本結(jié)構(gòu)是更優(yōu)秀的呢?

// 方法 A :在循環(huán)體外部定義

 

Widget w;

 

for (int i = 0; i < n; ++i){

 w = 取決于 i 的某個(gè)值 ;

 ...

}

 

// 方法 B: 在循環(huán)體內(nèi)部定義

 

for (int i = 0; i < n; ++i) {

Widget w( 取決于 i 的某個(gè)值 ) ;

 ...

}

這里我使用了 Widget 類型的對象,而不是 string 類型的對象,從而避免了進(jìn)行構(gòu)造、析構(gòu)、或者對象賦值等過程帶來的誤差。

對于 Widget 的操作而言,上面兩種方法所帶來的開銷如下:

方法 A 1 個(gè)構(gòu)造函數(shù) + 1 個(gè)析構(gòu)函數(shù) + n 次賦值。

方法 B n 個(gè)構(gòu)造函數(shù) + n 個(gè)析構(gòu)函數(shù)。

對于那些一次賦值操作比一對構(gòu)造 - 析構(gòu)操作開銷更低的類而言,方法 A 是較高效的。尤其是在 n 較大的情況下。否則方法 B 就是更好的選擇。還有,方法 A 使得 w 位于一個(gè)比方法 B 更大的作用域中,這是違背程序的可讀性和可維護(hù)性原則的。因此,除非你確認(rèn) : (1) 賦值操作比一對構(gòu)造 - 析構(gòu)操作更高效, (2) 當(dāng)前代碼是對性能敏感的;其他任何情況下,你都應(yīng)該使用方法 B

銘記在心

定義變量的時(shí)機(jī)越晚越好。這可以提高程序的清晰度和工作效率。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩久久精品| 99国产精品久久久久老师| 久久爱www| 午夜精品国产精品大乳美女| 暖暖成人免费视频| 欧美在线免费一级片| 国产精品美女一区二区在线观看| 美女任你摸久久| 国产日韩欧美成人| 久久激情视频久久| 久久精品国产在热久久| 精品999在线观看| 亚洲视频电影图片偷拍一区| 久久亚裔精品欧美| 欧美 亚欧 日韩视频在线| 1024国产精品| 久久久久久网站| 国产精品一区二区久久精品| 在线亚洲激情| 久久久久久久久久久成人| **网站欧美大片在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 免费成人在线观看视频| 亚洲婷婷综合色高清在线| aa级大片欧美| 欧美日韩不卡| 欧美大片在线看| 国产精品久久久久毛片软件 | 久久精品成人欧美大片古装| 欧美日韩dvd在线观看| 午夜精品福利视频| 亚洲欧美国产精品专区久久| 在线观看亚洲视频| 久久久噜噜噜久久人人看| 亚洲国产你懂的| 一区二区精品在线| 极品尤物一区二区三区| 欧美午夜精品久久久| 米奇777在线欧美播放| 午夜伦理片一区| 亚洲精品欧美| 伊人婷婷欧美激情| 欧美日韩www| 亚洲午夜在线观看视频在线| 欧美大胆人体视频| 久久久高清一区二区三区| 亚洲欧美在线网| 可以看av的网站久久看| 国产精品久久久久久久久久免费| 欧美日韩亚洲精品内裤| 国产精品福利在线观看网址| 国产一区在线免费观看| 国产亚洲人成网站在线观看| 欧美日韩国产成人高清视频| 免费成人高清视频| 欧美电影免费| 欧美精品在线免费观看| 欧美精品在线观看| 国产精品麻豆成人av电影艾秋| 国产精品mm| 极品尤物av久久免费看| 久久琪琪电影院| 欧美体内she精视频在线观看| 欧美www在线| 欧美色视频一区| 国产自产2019最新不卡| 亚洲国产精品久久精品怡红院| 亚洲国产欧美在线人成| 中文国产成人精品久久一| 欧美一区二区三区免费视| 久久综合一区二区三区| 亚洲国产精品一区二区三区| 一本色道久久综合亚洲精品婷婷 | 亚洲在线视频一区| 久久这里只有精品视频首页| 欧美日韩你懂的| **网站欧美大片在线观看| 亚洲免费影视| 亚洲人成人一区二区三区| 欧美在线观看网站| 欧美日韩直播| 一本不卡影院| 欧美激情一二三区| 久久精品论坛| 国产色视频一区| 午夜在线成人av| 亚洲欧美成人网| 国产精品嫩草99av在线| 一区二区三区日韩精品视频| 亚洲国产欧美一区二区三区久久| 久久成人免费电影| 亚洲欧美伊人| 国产精品久久久久久久久果冻传媒| 亚洲精华国产欧美| 亚洲第一主播视频| 欧美国产欧美亚州国产日韩mv天天看完整| 国产手机视频精品| 久久综合导航| 欧美成人黄色小视频| 亚洲激情视频网| 日韩小视频在线观看| 国产精品国产自产拍高清av王其| 亚洲一区二区久久| 亚洲靠逼com| 国产美女精品免费电影| 久久都是精品| 欧美成人小视频| 在线一区日本视频| 亚洲免费视频中文字幕| 影音先锋成人资源站| 亚洲欧洲精品一区二区三区不卡 | 午夜国产欧美理论在线播放| 国产精品自拍网站| 欧美高清视频在线观看| 欧美欧美全黄| 快she精品国产999| 国产精品高潮呻吟久久| 裸体素人女欧美日韩| 欧美视频观看一区| 男人的天堂亚洲| 国产亚洲一区在线播放| 亚洲精品一区二| 在线观看亚洲精品| 欧美专区第一页| 亚洲天堂久久| 欧美成人激情视频免费观看| 久久成人18免费网站| 欧美日韩精品不卡| 免费的成人av| 一区二区三区在线免费播放| 亚洲香蕉伊综合在人在线视看| 亚洲日本成人网| 久久综合伊人77777尤物| 久久久国产精品亚洲一区 | 樱桃成人精品视频在线播放| 亚洲制服av| 久久国产精品99国产精| 国产精一区二区三区| 亚洲尤物在线视频观看| 亚洲永久免费精品| 欧美视频一区| 亚洲影院免费观看| 香蕉视频成人在线观看| 性欧美超级视频| 久久精品国产视频| 黄色一区二区三区| 久久久青草婷婷精品综合日韩| 免费精品视频| 亚洲视频在线播放| 国产真实乱子伦精品视频| 午夜精品福利在线| 久久亚洲国产精品一区二区| 1024国产精品| 国产精品尤物福利片在线观看| 久久视频国产精品免费视频在线| 欧美激情女人20p| 欧美一区二区三区久久精品茉莉花| 国产日韩欧美一区在线 | 亚洲午夜精品久久| 久久久久久欧美| 亚洲激情不卡| 欧美日韩在线视频一区二区| 亚洲欧美www| 欧美不卡在线视频| 欧美视频在线观看视频极品| 亚洲国产精品成人一区二区| 99亚洲一区二区| 国产婷婷精品| 欧美精品一区二区三区一线天视频| 99精品福利视频| 久久免费国产| 亚洲午夜电影在线观看| 国产自产精品| 欧美日本一道本| 久久riav二区三区| 一本到高清视频免费精品| 久久人人看视频| 一区二区三区不卡视频在线观看| 中文一区二区在线观看| 久久亚洲影音av资源网| 亚洲直播在线一区| 在线看欧美日韩| 国产精品vvv| 欧美精品久久久久久久| 模特精品在线| 麻豆freexxxx性91精品| 亚洲一区二区在线视频| 亚洲午夜激情免费视频| 亚洲精品一区在线观看| 久久久久久久网| 免费久久99精品国产自在现线| 欧美性猛片xxxx免费看久爱| 欧美在线电影| 欧美一区二区视频在线观看2020 | 亚洲国产高清自拍| 亚洲成色www久久网站| 亚洲一区二区三区在线观看视频| 亚洲区欧美区| 欧美乱妇高清无乱码| 国产精品腿扒开做爽爽爽挤奶网站|