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

洛譯小筑

別來無恙,我的老友…
隨筆 - 45, 文章 - 0, 評論 - 172, 引用 - 0
數據加載中……

[ECPP讀書筆記 條目26] 定義變量的時機越晚越好

你經常要使用構造函數或者析構函數來定義某個類型的一個變量,當系統在運行至變量的定義時,就會引入一次構造的開銷;在變量達到自身作用域的邊界時,就會引入一次析構的開銷。未使用的變量也會帶來一定的開銷,所以你應該盡可能的避免這種浪費的出現。

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

// 這個函數定義"encrypted"變量的時機過早

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;

}

本函數中,盡管對象encrypted并不是完全未使用的,但是在拋出異常的情況下,函數就不會使用它。也就是說,即使encryptPassword拋出一個異常,你也要為encrypted付出一次構造和一次析構的代價。因此,你最好推遲encrypted的定義,直到你確認你需要它時再進行:

// 這個函數推遲了encrypted的定義,直到真正需要它時再進行

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;

}

上面的代碼還沒有那么嚴謹,這是因為在定義encrypted時沒有為它設置任何初始化參數。這就意味著編譯器將調用它的默認構造函數。通常情況下,你要對一個對象需要做的第一件事就是為它賦一個值,通常是通過一次賦值操作。條目4中解釋了為什么使用默認構造函數構造對象并為其賦值,要比使用需要的值對其進行初始化的效率低一些。那里的分析符合此處的情況。比如說,可以假設的較困難的部分是通過下面的函數來解決的:

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

encryptPassword就應該以下面的方式來實現了,盡管它不是最優秀的:

// 這一函數推遲了enctypted定義的時機,直到需要時才進行。

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

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

{

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

 

  std::string encrypted;           // encrypted的默認構造函數版本

  encrypted = password;            // encrypted賦值

 

  encrypt(encrypted);

  return encrypted;

}

更好的一種實現方式是,使用password來初始化encrypted,這樣就可以跳過默認構造過程所帶來的無謂的性能開銷:

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

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

{

  ...                              // 檢查長度

 

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

 

  encrypt(encrypted);

  return encrypted;

}

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

但是循環呢?你可能會想。如果一個變量僅僅在循環題中使用,那么更好的選擇是:將它定義在循環題的外部,在每次循環迭代前對其進行賦值;還是:在循環體的內部定義變量?也就是說,哪種基本結構是更優秀的呢?

// 方法A:在循環體外部定義

 

Widget w;

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

  w = 取決于i的某個值;

  ...

}

 

// 方法B: 在循環體內部定義

 

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

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

  ...

}

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

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

方法A:1個構造函數 + 1個析構函數 + n次賦值。

方法B:n個構造函數 + n個析構函數。

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

時刻牢記

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

 

posted on 2007-08-19 22:00 ★ROY★ 閱讀(1199) 評論(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>
            欧美一区二区三区精品| 久久精品国产亚洲aⅴ| 日韩亚洲欧美综合| 国产亚洲欧美激情| 国产亚洲精品aa| 久久av红桃一区二区小说| 一区二区三区欧美在线观看| 久久噜噜噜精品国产亚洲综合| 亚洲一区二区欧美日韩| 夜夜嗨av色综合久久久综合网| 国产日韩精品一区二区| 国产精品一区久久久| 国产精品久久久久9999吃药| 欧美大片一区二区三区| 欧美精品亚洲精品| 快播亚洲色图| 另类天堂视频在线观看| 久久资源av| 另类尿喷潮videofree| 欧美日韩午夜在线| 国产亚洲女人久久久久毛片| 亚洲国产高清在线观看视频| 一本色道久久综合一区| 欧美日韩在线一二三| 欧美韩日精品| 国产亚洲精品自拍| 亚洲国产日韩欧美综合久久 | 亚洲欧美成人精品| 欧美一区视频| 日韩天堂在线视频| 美女国内精品自产拍在线播放| 欧美精品在线看| 在线观看视频免费一区二区三区| 在线观看日韩| 免费成人美女女| 亚洲一区二区三区四区中文| 久久久久国产精品人| 国产精品青草久久久久福利99| 狠色狠色综合久久| 欧美在线视频一区二区三区| 亚洲第一毛片| 免费成人在线观看视频| 国产亚洲欧美日韩美女| 亚洲欧美高清| 亚洲国产精品成人综合| 久久久久一区二区三区| 国产精品免费看片| 亚洲特级片在线| 亚洲日本va午夜在线影院| 久久精品国产久精国产思思| 国产视频在线观看一区二区| 欧美一区国产二区| 欧美亚洲综合久久| 好吊妞**欧美| 亚洲激情影院| 欧美午夜宅男影院| 久久国产精品久久久| 一区二区三区久久久| 亚洲欧洲日产国产综合网| 欧美成人免费播放| 伊人久久亚洲热| 亚洲国产日韩欧美在线99| 美女91精品| 亚洲美女黄色| 亚洲欧美成aⅴ人在线观看| 国产精品久久久久久久久| av成人老司机| 欧美欧美在线| 亚洲一区二区日本| 中文日韩在线视频| 国产精品视频免费一区| 欧美一级免费视频| 欧美在线视频二区| 国语自产精品视频在线看抢先版结局 | 亚洲伊人色欲综合网| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 久久久久久久综合狠狠综合| 午夜日韩在线观看| 韩日欧美一区二区| 欧美成人一品| 欧美精品在线播放| 亚洲欧美日韩精品在线| 亚洲看片一区| 一区二区三区视频观看| 国产一区二区成人| 国产亚洲一区二区三区| 欧美成人免费va影院高清| 免费成人毛片| 午夜精品免费视频| 久久这里只有| 欧美日韩精品免费观看视一区二区| 亚洲一区三区电影在线观看| 欧美一区二区三区在| 亚洲黄色影院| 亚洲女女女同性video| 亚洲国产精品日韩| 99re热这里只有精品免费视频| 99精品国产在热久久| av成人激情| 亚洲欧美日韩电影| 精品不卡视频| 一本到12不卡视频在线dvd| 国产一区二区高清不卡| 亚洲国产一区二区三区在线播 | 亚洲一区二区三区久久| 一区二区三区在线不卡| 久久蜜桃香蕉精品一区二区三区| 狠狠色丁香婷婷综合久久片| 亚洲国产精品国自产拍av秋霞| 欧美日韩一级黄| 久久不射电影网| 欧美激情精品久久久久久久变态 | 久久久久久久欧美精品| 一区二区三区欧美亚洲| 久久精品国产91精品亚洲| 亚洲网站视频| 欧美国产第二页| 欧美成人a∨高清免费观看| 国产精品v欧美精品v日韩 | 99国产精品久久久久久久| 在线播放日韩| 久久aⅴ国产紧身牛仔裤| 午夜精品久久久久久| 欧美日韩国产天堂| 亚洲国内高清视频| 1000部国产精品成人观看| 亚洲欧美在线免费| 亚洲图片欧美午夜| 欧美精品一区二区在线观看 | 日韩视频在线观看一区二区| 在线观看亚洲视频| 久久精品30| 久久先锋资源| 精品成人国产在线观看男人呻吟| 欧美一级艳片视频免费观看| 性欧美xxxx大乳国产app| 国产精品都在这里| 亚洲一区二区视频| 先锋影音久久| 国产麻豆综合| 午夜欧美大尺度福利影院在线看| 欧美一区二区女人| 国产日产精品一区二区三区四区的观看方式 | 在线亚洲精品福利网址导航| 久久综合五月天婷婷伊人| 欧美不卡高清| 欧美亚洲综合网| 国产欧美一区二区精品忘忧草| 亚洲四色影视在线观看| 亚洲欧美一区在线| 99国产精品久久久| 老司机精品视频网站| 欧美日韩一区成人| 亚洲剧情一区二区| 亚洲综合首页| 欧美一区二区三区免费观看视频 | 裸体歌舞表演一区二区| 国产精品女人久久久久久| 一本到高清视频免费精品| 亚洲新中文字幕| 国产精品人人做人人爽| 欧美一区二区三区视频| 可以免费看不卡的av网站| 亚洲国产导航| 欧美丝袜第一区| 久久国产66| 亚洲区一区二| 午夜免费在线观看精品视频| 国产一区二区三区的电影| 老司机精品视频网站| 亚洲免费观看高清在线观看| 欧美一区二区三区久久精品茉莉花 | 亚洲国产精品t66y| 欧美日韩国产电影| 久久国产色av| 野花国产精品入口| 快射av在线播放一区| 正在播放亚洲一区| 国模套图日韩精品一区二区| 欧美激情在线| 久久国产精品亚洲77777| 亚洲三级视频在线观看| 久久九九全国免费精品观看| 99re在线精品| 伊伊综合在线| 国产欧美日韩不卡免费| 欧美另类高清视频在线| 久久精品国产99| 亚洲一区久久久| 日韩视频免费在线| 欧美福利一区二区三区| 久久久.com| 亚洲资源av| 夜夜夜久久久| 亚洲精品美女久久久久| 国产综合色在线视频区| 国产精品女人网站| 欧美日韩一区二区三区在线| 欧美成人福利视频| 久久综合久久综合久久|