亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

只要有可能就推遲變量定義

2019-11-17 05:09:40
字體:
來源:轉載
供稿:網友

  在極大程度上,為你的類(包括類模板)和函數(包括函數模板)提供正確的定義是戰斗的要害性部分。一旦你得到正確的結果,相應的實現很大程度上就是直截了當的。但是仍然有一些注重事項需要當心。過早地定義變量會對性能產生拖累。
過度使用強制轉換會導致緩慢的,難以維護的,被微妙的 bug 困擾的代碼。返回一個類內部構件的句柄會破壞封裝并將空懸句柄留給客戶。疏忽了對異常產生的影響的考慮會導致資源的泄漏和數據結構的破壞。過分內聯化(inlining)會導致代碼膨脹。過度的耦合會導致令人無法接受的漫長的建構時間。 這一切問題都可以避免。

  只要有可能就推遲變量定義

  只要你定義了一個帶有構造函數和析構函數的類型的變量,當控制流程到達變量定義的時候會使你擔負構造成本,而當變量離開作用域的時候會使你擔負析構成本。假如有無用變量造成這一成本,你就要盡你所能去避免它。

  你可能認為你從來不會定義無用的變量,但是也許你應該再想一想。考慮下面這個函數,只要 passWord 的長度滿足要求,它就返回一個 password 的加密版本。假如 password 太短,函數就會拋出一個定義在標準 C++ 庫中的 logic_error 類型的異常(參見 Item 54):

  

  // this function defines the variable "encrypted" too soon

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

  {

   using namespace std;

  

   string encrypted;

  

   if (password.length() < MinimumPasswordLength) {

    throw logic_error("Password is too short");

   }

   ... // do whatever is necessary to place an

   // encrypted version of password in encrypted

   return encrypted;

  }

  

  對象 encrypted 在這個函數中并不是完全無用,但是假如拋出了一個異常,它就是無用的。換句話說,即使 encryptPassword 拋出一個異常,你也要為構造和析構 encrypted 付出代價。因此得出以下結論:你最好將 encrypted 的定義推遲到你確信你真的需要它的時候:

  

  // this function postpones encrypted’s definition until it’s truly necessary

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

  {

   using namespace std;

  

   if (password.length() < MinimumPasswordLength) {

    throw logic_error("Password is too short");

   }

  

   string encrypted;

   

   ... // do whatever is necessary to place an

   // encrypted version of password in encrypted

   return encrypted;

  }

  這一代碼仍然沒有達到它本可以達到的那樣緊湊,因為定義 encrypted 的時候沒有任何初始化參數。這就意味著很多情況下將使用它的缺省構造函數,對于一個對象你首先應該做的就是給它一些值,這經??梢酝ㄟ^賦值來完成我已經解釋了為什么缺省構造(default-constrUCting)一個對象然后賦值給它比用你真正需要它持有的值初始化它更低效。那個分析也適用于此。例如,假設 encryptPassword 的核心部分是在這個函數中完成的:

  

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

  那么,encryptPassword 就可以這樣實現,即使它還不是最好的方法:

  

  // this function postpones encrypted’s definition until

  // it’s necessary, but it’s still needlessly inefficient

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

  {

   ... // check length as above

  

   std::string encrypted; // default-construct encrypted

   encrypted = password; // assign to encrypted

  

   encrypt(encrypted);

   return encrypted;

  }

 

  一個更可取得方法是用 password 初始化 encrypted,從而跳過毫無意義并可能很昂貴的缺省構造:

  

  // finally, the best way to define and initialize encrypted

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

  {

   ... // check length

  

   std::string encrypted(password); // define and initialize

   // via copy constructor

  

   encrypt(encrypted);

   return encrypted;

  }

  這個建議就是本 Item 的標題中的“只要有可能(as long as possible)”的真正含義。你不僅應該推遲一個變量的定義直到你不得不用它之前的最后一刻,而且應該試圖推遲它的定義直到你得到了它的初始化參數。通過這樣的做法,你可以避免構造和析構無用對象,而且還可以避免不必要的缺省構造。更進一步,通過在它們的含義已經非常明確的上下文中初始化它們,有助于對變量的作用文檔化。

  “但是對于循環會如何?”你可能會有這樣的疑問。假如一個變量僅僅在一個循環內使用,是循環外面定義它并在每次循環迭代時賦值給它更好一些,還是在循環內部定義這個變量更好一些呢?也就是說,下面這兩個大致的結構中哪個更好一些?

  

  // ApPRoach A: define outside loop // Approach B: define inside loop

  

  Widget w;

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

  w = some value dependent on i; Widget w(some value dependent on i);

  ... ...

  } }

  這里我將一個類型 string 的對象換成了一個類型 Widget 的對象,以避免對這個對象的構造、析構或賦值操作的成本的任何已有的預見。

  對于 Widget 的操作而言,就是下面這兩個方法的成本:

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

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

  對于那些賦值的成本低于一個構造函數/析構函數對的成本的類,方法 A 通常更高效。非凡是在 n 變得很大的情況下。否則,方法 B 可能更好一些。此外,方法 A 與方法 B 相比,使得名字 w 在一個較大的區域(包含循環的那個區域)內均可見,這可能會破壞程序的易理解性和可維護性。因此得出以下結論:除非你確信以下兩點:(1)賦值比構造函數/析構函數對成本更低,而且(2)你正在涉及你的代碼中的性能敏感的部分,否則,你應該默認使用方法 B。

  Things to Remember

  ·只要有可能就推遲變量定義。這樣可以增加程序的清楚度并提高程序的性能。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文国产成人精品久久一| 91欧美视频网站| 日韩激情第一页| 55夜色66夜色国产精品视频| 欧美性受xxxx白人性爽| 日韩美女在线观看一区| 欧美成人免费在线观看| 亚洲国产精品推荐| 亚洲精品国产精品久久清纯直播| 高清一区二区三区四区五区| 91九色蝌蚪国产| 欧洲永久精品大片ww免费漫画| 91亚洲国产成人久久精品网站| 精品视频在线播放色网色视频| 亚洲大胆人体av| 国外日韩电影在线观看| 91美女片黄在线观看游戏| 欧美美女15p| 亚洲成人999| 91精品国产综合久久香蕉| 国产精品欧美激情| 国产99视频精品免视看7| 欧美在线一级va免费观看| 国产精自产拍久久久久久| 欧美放荡办公室videos4k| 日韩中文字幕免费视频| 欧美精品在线观看91| 伊人激情综合网| 亚洲精品ady| 欧美日韩亚洲高清| 亚洲欧洲中文天堂| 亚洲午夜精品久久久久久性色| 在线视频中文亚洲| 日本成人激情视频| 中文字幕日韩精品在线| 精品免费在线观看| 91伊人影院在线播放| 亚洲欧美日韩一区二区在线| 91夜夜揉人人捏人人添红杏| 亚洲成年网站在线观看| 色综合男人天堂| 国内精品模特av私拍在线观看| 国产精品久久电影观看| 亚洲女人天堂网| 少妇高潮 亚洲精品| 色噜噜狠狠狠综合曰曰曰88av| 欧美寡妇偷汉性猛交| 欧美性生活大片免费观看网址| 韩国日本不卡在线| 日韩有码在线电影| 久久久精品国产网站| 亚洲国产精品久久精品怡红院| 精品国产老师黑色丝袜高跟鞋| 国产精品 欧美在线| 午夜精品久久久久久久99热浪潮| 91九色视频在线| 久久久精品国产网站| 曰本色欧美视频在线| 国产午夜精品一区理论片飘花| 欧美一二三视频| 久久不射热爱视频精品| 尤物tv国产一区| 欧美日韩福利在线观看| 亚洲国产成人一区| 欧美另类精品xxxx孕妇| 国产精品久久77777| 不卡av日日日| 欧美高清视频免费观看| 午夜精品www| 福利视频一区二区| 4k岛国日韩精品**专区| 亚洲成人性视频| 久久久免费高清电视剧观看| 亚洲国产日韩欧美在线图片| 日韩精品在线第一页| 色婷婷亚洲mv天堂mv在影片| 91视频国产精品| 国产精品美女视频网站| 久久久久久久久久久久久久久久久久av| 国产色婷婷国产综合在线理论片a| 精品香蕉在线观看视频一| 久久久久久国产精品| 日韩中文字幕免费看| 日韩av电影在线播放| 久久久国产成人精品| 欧美专区在线观看| 亚洲在线免费视频| 456亚洲影院| 日韩亚洲第一页| 国产欧美日韩中文字幕| 久久夜色精品国产亚洲aⅴ| 国内自拍欧美激情| 亚洲视频欧美视频| 久久精品小视频| 日韩精品视频在线观看网址| 欧美亚州一区二区三区| 久久精品国产99国产精品澳门| 91九色综合久久| 久久高清视频免费| 亚洲欧美日韩爽爽影院| 久久久久久这里只有精品| 日韩中文字幕av| 亚洲精品久久久久久久久久久| 亚洲国产欧美日韩精品| 国产精品女人网站| 国产网站欧美日韩免费精品在线观看| 日韩在线欧美在线| 日韩av网站电影| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲a成v人在线观看| 国产一区私人高清影院| 亚洲一级黄色av| 亚洲最大的免费| 成人深夜直播免费观看| 精品无人区太爽高潮在线播放| 亚洲欧美国产精品va在线观看| 日韩福利在线播放| 亚洲激情久久久| 成人午夜小视频| 欧美韩国理论所午夜片917电影| 亚洲欧美综合图区| 久久中文久久字幕| 欧美精品www在线观看| 欧美午夜宅男影院在线观看| 久久久久久亚洲精品不卡| 国产精品久久久久aaaa九色| 欧美成aaa人片在线观看蜜臀| 欧美性猛交xxxx黑人猛交| 亚洲男女自偷自拍图片另类| 久久久久成人精品| 国产一区二区三区三区在线观看| 色www亚洲国产张柏芝| 亚洲国产成人在线视频| 久久激情五月丁香伊人| 久久精品视频在线| 久久亚洲国产精品成人av秋霞| 91亚洲精品视频| 亚洲成**性毛茸茸| 欧美夜福利tv在线| 亚洲天堂第二页| 欧美日韩精品中文字幕| 亚洲精品国产精品国自产观看浪潮| 欧美一级免费视频| 韩国日本不卡在线| 成人在线中文字幕| 日本精品久久久久影院| 亚洲社区在线观看| 欧美裸体xxxx极品少妇| 最新日韩中文字幕| www.日韩视频| 久久久久国产一区二区三区| 亚洲一区二区三区成人在线视频精品| 性金发美女69hd大尺寸| 伊人伊人伊人久久| 日韩精品在线视频观看| 亚洲人成五月天| 国内精品久久久久久| 国产精品美女999| 欧美国产日韩一区二区| 成人性教育视频在线观看| 日韩在线不卡视频| 国产精品扒开腿做爽爽爽的视频| 欧美另类老女人| 亚洲已满18点击进入在线看片|