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

洛譯小筑

別來(lái)無(wú)恙,我的老友…
隨筆 - 45, 文章 - 0, 評(píng)論 - 172, 引用 - 0
數(shù)據(jù)加載中……

[ECPP讀書筆記 條目26] 定義變量的時(shí)機(jī)越晚越好

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

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

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

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

{

  using namespace std;

 

  string encrypted;

 

  if (password.length() < MinimumPasswordLength) {

     throw logic_error("Password is too short");

  }

  ...                              // 對(duì)密碼加密

  return encrypted;

}

本函數(shù)中,盡管對(duì)象encrypted并不是完全未使用的,但是在拋出異常的情況下,函數(shù)就不會(huì)使用它。也就是說(shuō),即使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;

 

  ...                              // 對(duì)密碼加密

  return encrypted;

}

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

void encrypt(std::string& s);     // 適時(shí)為s加密

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

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

// 但仍然會(huì)帶來(lái)不必要的效率問(wèn)題。

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

{

  ...                              // 同上,檢查密碼長(zhǎng)度

 

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

  encrypted = password;            // 對(duì)encrypted賦值

 

  encrypt(encrypted);

  return encrypted;

}

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

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

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

{

  ...                              // 檢查長(zhǎng)度

 

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

 

  encrypt(encrypted);

  return encrypted;

}

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

但是循環(huán)呢?你可能會(huì)想。如果一個(gè)變量?jī)H僅在循環(huán)題中使用,那么更好的選擇是:將它定義在循環(huán)題的外部,在每次循環(huán)迭代前對(duì)其進(jìn)行賦值;還是:在循環(huán)體的內(nèi)部定義變量?也就是說(shuō),哪種基本結(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類型的對(duì)象,而不是string類型的對(duì)象,從而避免了進(jìn)行構(gòu)造、析構(gòu)、或者對(duì)象賦值等過(guò)程帶來(lái)的誤差。

對(duì)于Widget的操作而言,上面兩種方法所帶來(lái)的開銷如下:

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

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

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

時(shí)刻牢記

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

 

posted on 2007-08-19 22:00 ★ROY★ 閱讀(1209) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Effective C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合综合久久综合| 最新69国产成人精品视频免费| 麻豆国产精品va在线观看不卡| 欧美女同视频| 久久尤物视频| 亚洲视频www| 在线观看欧美亚洲| 亚洲免费一级电影| 亚洲视频碰碰| 蜜桃精品一区二区三区 | 日韩午夜三级在线| 欧美专区第一页| 亚洲综合导航| 欧美日韩二区三区| 欧美高清视频一二三区| 黄色在线一区| 欧美综合第一页| 午夜在线电影亚洲一区| 欧美日韩一区二区三区四区在线观看 | 国产精品久久久久一区二区三区共 | 亚洲毛片在线看| 久久久久久久久一区二区| 欧美一区二区在线看| 国产精品国产自产拍高清av王其| 亚洲精华国产欧美| 亚洲国内精品| 欧美成人一品| 亚洲国产精品t66y| 亚洲毛片在线观看| 欧美高清视频一区二区三区在线观看| 欧美成人xxx| 最新中文字幕亚洲| 欧美电影免费| 亚洲激情第一区| 日韩一区二区高清| 欧美精品一区在线| 99国产精品视频免费观看一公开| 99re66热这里只有精品3直播| 欧美福利视频一区| 亚洲精品国产精品久久清纯直播| 亚洲精品在线观看视频| 欧美日韩精品一区二区三区四区| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲国产电影| 99精品免费网| 国产精品黄视频| 亚洲欧美日韩精品久久亚洲区 | 亚洲精品久久久久久久久久久久| 一区二区三区蜜桃网| 欧美天天影院| 久久国产精品亚洲va麻豆| 另类人畜视频在线| 日韩视频在线播放| 欧美午夜精品| 欧美在线观看视频在线| 亚洲电影下载| 亚洲欧美视频| 精品盗摄一区二区三区| 欧美看片网站| 亚洲你懂的在线视频| 久久综合国产精品台湾中文娱乐网| 亚洲国产精品99久久久久久久久| 欧美精品18| 性色一区二区三区| 亚洲第一精品夜夜躁人人爽| 亚洲一区在线看| 激情视频一区二区三区| 欧美国产综合视频| 亚洲欧美一区二区原创| 欧美激情一二三区| 亚洲综合色自拍一区| 亚洲第一精品久久忘忧草社区| 亚洲天堂av在线免费观看| 一区二区三区欧美成人| 国产欧美亚洲精品| 欧美经典一区二区| 欧美在线视频免费观看| 亚洲激情电影在线| 久久久久久久网站| 国产精品99久久99久久久二8| 黑人巨大精品欧美黑白配亚洲| 欧美激情女人20p| 欧美一区二区在线观看| 一本色道久久综合亚洲精品高清| 狂野欧美一区| 香蕉av福利精品导航| 亚洲精品中文字幕有码专区| 国内自拍视频一区二区三区| 欧美日韩视频在线第一区| 久久综合色影院| 欧美一区二区三区啪啪| 亚洲一二三四区| 亚洲欧洲一区二区在线观看 | 麻豆成人av| 午夜久久电影网| 在线一区二区三区做爰视频网站 | 欧美国产精品| 久久九九99| 久久av红桃一区二区小说| 国内精品久久久久久| 久久野战av| 久久久久综合网| 欧美在线视频观看免费网站| 亚洲综合色网站| 亚洲天堂av电影| 亚洲午夜小视频| 国产精品99久久不卡二区| 日韩亚洲精品电影| 亚洲日本精品国产第一区| 亚洲电影自拍| 亚洲高清视频一区二区| 欧美黄色视屏| 欧美大片91| 亚洲高清视频在线观看| 亚洲高清视频的网址| 亚洲大片av| 91久久在线播放| 亚洲人成人一区二区三区| 最新中文字幕亚洲| 亚洲欧洲精品一区| 亚洲精品一区二区三区婷婷月| 亚洲国产精品久久久久秋霞蜜臀| 欧美高清视频在线播放| 你懂的成人av| 欧美激情在线观看| 亚洲欧洲在线视频| 99成人在线| 亚洲影院高清在线| 欧美在线观看视频一区二区| 久久成人人人人精品欧| 久久综合狠狠| 欧美黄色一级视频| 欧美视频在线观看免费网址| 国产精品老女人精品视频| 国产农村妇女精品一区二区| 激情成人中文字幕| 99re热这里只有精品视频| 亚洲一区二区三区免费视频| 欧美在线播放一区二区| 久久免费视频观看| 亚洲国产一区二区三区在线播 | 欧美日韩伦理在线免费| 国产精品免费福利| 国产一区二区三区久久悠悠色av | 国产日韩成人精品| 亚洲大胆人体在线| 一本色道久久综合亚洲二区三区 | 亚洲国产成人精品视频| 国产精品99久久久久久久久| 欧美一区二区精品在线| 免费在线一区二区| 国产精品福利久久久| 狠狠干成人综合网| 一区二区三区日韩欧美精品| 欧美诱惑福利视频| 亚洲成色最大综合在线| 久久蜜桃精品| 亚洲区第一页| 午夜精品久久久久| 欧美国产先锋| 黑人巨大精品欧美黑白配亚洲| 日韩一区二区福利| 蜜臀va亚洲va欧美va天堂| 99国产精品99久久久久久粉嫩 | 亚洲午夜精品一区二区三区他趣| 久久久av水蜜桃| 国产精品美女在线| 亚洲精品乱码久久久久久| 久久九九有精品国产23| 99热这里只有成人精品国产| 久久影视三级福利片| 国产精品一区二区久久精品| 日韩亚洲精品在线| 美女诱惑一区| 午夜精品一区二区在线观看| 欧美日韩福利视频| 亚洲大胆女人| 久久综合色影院| 亚洲综合色婷婷| 欧美特黄一级| 99精品欧美一区二区三区| 欧美国产大片| 久久久久网站| 黄色成人av在线| 久久福利影视| 亚洲女女女同性video| 国产精品家教| 亚洲天堂av图片| 亚洲精品网站在线播放gif| 蜜桃久久av一区| 亚洲国产欧美一区二区三区同亚洲 | 亚洲专区在线视频| 国产精品久久久久aaaa| 亚洲一二区在线| 一区二区免费在线视频| 欧美日韩黄色大片| 99视频+国产日韩欧美| 91久久久在线| 欧美日韩国产综合视频在线| 日韩午夜激情av|