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

洛譯小筑

別來無恙,我的老友…
隨筆 - 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★ 閱讀(1190) 評論(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>
            一区二区欧美日韩视频| 亚洲大胆人体在线| 中文一区二区在线观看| 免播放器亚洲| 亚洲三级免费| 999亚洲国产精| 国产精品美女一区二区| 欧美综合二区| 久久亚洲免费| 日韩一级黄色av| 夜夜爽av福利精品导航| 国产日韩精品在线播放| 毛片精品免费在线观看| 欧美精品91| 午夜久久久久久| 久久久www| 正在播放日韩| 欧美在线三级| 亚洲国产精品尤物yw在线观看| 91久久午夜| 欧美网站大全在线观看| 久久午夜电影| 欧美日韩一卡二卡| 久久久在线视频| 欧美日韩国产成人在线免费| 欧美亚洲日本国产| 免费视频一区| 久久精品国产精品亚洲精品| 欧美国产极速在线| 久久男女视频| 欧美日韩中文字幕| 久久一综合视频| 国产精品激情电影| 欧美黄色小视频| 国产日韩欧美日韩| 日韩亚洲不卡在线| 亚洲国产精品va在看黑人| 亚洲在线中文字幕| 一本色道久久88综合亚洲精品ⅰ| 欧美一区二区视频网站| 一本色道久久综合一区| 久久久夜夜夜| 久久久久成人精品| 国产精品美女999| 最新亚洲视频| 亚洲黄色精品| 久久综合九色九九| 久久久亚洲国产天美传媒修理工| 欧美亚男人的天堂| 亚洲精品偷拍| 亚洲日韩第九十九页| 久久噜噜噜精品国产亚洲综合| 欧美呦呦网站| 国产精品女人网站| 亚洲视频在线观看网站| 正在播放亚洲| 欧美日韩免费在线观看| 亚洲欧洲偷拍精品| 亚洲精品午夜精品| 欧美电影免费观看| 亚洲黄色免费| 日韩视频亚洲视频| 欧美精品亚洲精品| 亚洲三级电影在线观看| 亚洲美女福利视频网站| 欧美成人精品在线| 亚洲黄色影片| 中文亚洲视频在线| 国产精品va在线| 国产伦精品一区二区三区四区免费 | 欧美日韩国产成人| 亚洲国产精品99久久久久久久久| 曰韩精品一区二区| 狂野欧美一区| 亚洲国产婷婷香蕉久久久久久| 亚洲精品国精品久久99热| 欧美激情视频一区二区三区在线播放 | 亚洲免费视频网站| 久久精品亚洲一区| 在线观看久久av| 欧美大片专区| 一本久道久久综合中文字幕| 午夜老司机精品| 国自产拍偷拍福利精品免费一| 久久精品日韩欧美| 亚洲国产精品福利| 午夜国产精品视频| 国内激情久久| 欧美成在线视频| 亚洲图片在线| 老巨人导航500精品| 亚洲美女性视频| 国产精品日日摸夜夜添夜夜av | 一区二区精品在线观看| 久久国产精品久久久久久久久久| 尤物yw午夜国产精品视频明星 | 亚洲视频综合| 美女脱光内衣内裤视频久久影院 | 日韩一区二区精品| 国产日产欧产精品推荐色| 免费高清在线视频一区·| 一区二区欧美在线观看| 久久在线播放| 亚洲无毛电影| 亚洲第一视频网站| 国产精品欧美日韩久久| 六月婷婷一区| 亚洲综合日韩中文字幕v在线| 免费一级欧美在线大片| 亚洲免费在线观看视频| 亚洲国产一区视频| 国产女主播视频一区二区| 欧美国产三级| 久久精品视频在线看| 日韩亚洲欧美成人| 欧美大片在线看| 久久精品国产第一区二区三区最新章节 | 欧美顶级大胆免费视频| 欧美一区二区在线看| 亚洲福利视频专区| 久久国产日本精品| 亚洲视频在线观看视频| 亚洲国产午夜| 国产亚洲精品一区二区| 欧美性大战久久久久久久蜜臀| 毛片基地黄久久久久久天堂| 欧美一区二区三区免费观看| 亚洲色图综合久久| 亚洲精选成人| 亚洲黄色高清| 欧美激情一区二区三区在线视频观看| 欧美一区二区在线观看| 亚洲男同1069视频| 亚洲视频一区在线| 中文久久乱码一区二区| 在线综合亚洲欧美在线视频| 亚洲精品在线视频观看| 亚洲精品久久久久中文字幕欢迎你 | 国产人妖伪娘一区91| 国产精品久久久久久久久久久久久久| 欧美大胆成人| 欧美大片在线看免费观看| 久热精品视频在线观看| 久久裸体艺术| 久久久久成人精品免费播放动漫| 亚洲欧美中日韩| 亚洲欧美在线播放| 欧美一级淫片播放口| 性伦欧美刺激片在线观看| 亚洲欧美制服另类日韩| 性做久久久久久| 久久精品成人一区二区三区| 久久久亚洲影院你懂的| 欧美xxxx在线观看| 欧美久久久久中文字幕| 国产精品福利在线观看| 国产三级欧美三级| 精品不卡在线| 亚洲精品影院在线观看| 99在线热播精品免费| 午夜精品av| 久久综合九色综合欧美狠狠| 另类专区欧美制服同性| 欧美激情亚洲国产| 亚洲毛片在线| 午夜精品在线视频| 久久五月激情| 欧美日韩国产成人精品| 国产欧美日韩综合一区在线观看 | 亚洲午夜三级在线| 欧美在线观看视频| 欧美成人免费在线观看| 亚洲免费成人av电影| 亚洲欧美卡通另类91av| 你懂的网址国产 欧美| 欧美日韩妖精视频| 国产欧美精品va在线观看| 黄色综合网站| 一本久久综合亚洲鲁鲁五月天| 性伦欧美刺激片在线观看| 蜜桃精品一区二区三区 | 欧美成人免费网站| 一本色道久久综合一区| 欧美伊人精品成人久久综合97| 欧美成人精品福利| 国产亚洲欧美在线| 亚洲视频图片小说| 欧美黄色影院| 欧美一级免费视频| 久久精品国产一区二区电影 | 欧美中文字幕在线| 亚洲第一区中文99精品| 亚洲一区二区在线| 欧美精品在线网站| 伊人精品久久久久7777| 欧美一区二视频| 99国产精品久久久久老师| 久久夜色精品国产亚洲aⅴ | 欧美日韩午夜在线视频| **网站欧美大片在线观看|