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

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

C++箴言:只要有可能就推遲變量定義

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

  在極大程度上,為你的類(包括類模板)和函數(包括函數模板)提供正確的定義是戰斗的要害性部分。一旦你得到正確的結果,相應的實現很大程度上就是直截了當的。但是仍然有一些注重事項需要當心。過早地定義變量會對性能產生拖累。過度使用強制轉換會導致緩慢的,難以維護的,被微妙的 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
中文字幕一区日韩电影| 欧美成人小视频| 狠狠躁18三区二区一区| 欧美日韩在线观看视频| 555www成人网| 九九热这里只有在线精品视| 亚洲午夜av电影| 久久激情五月丁香伊人| 国产精品福利在线观看| 欧美成在线视频| 中文字幕亚洲第一| 热久久免费视频精品| 亚洲爱爱爱爱爱| 中文精品99久久国产香蕉| 午夜精品久久久久久99热软件| 性色av一区二区三区| 亚洲欧美日韩久久久久久| 自拍偷拍亚洲欧美| 亚洲图片欧洲图片av| 欧美激情图片区| 成人av在线天堂| 欧美乱大交xxxxx另类电影| 欧美精品激情在线| 久久久久久久999| 国产一区二区丝袜高跟鞋图片| 亚洲精品国精品久久99热一| 欧美国产视频一区二区| 日韩黄色高清视频| www.日韩.com| 久久久久久亚洲精品| 亚洲国产精品推荐| 国产精品海角社区在线观看| 一本色道久久综合狠狠躁篇怎么玩| 久久久国产一区| 久久天天躁夜夜躁狠狠躁2022| 亚洲国产欧美久久| 成人免费视频在线观看超级碰| 亚洲欧美三级在线| 日韩国产精品亚洲а∨天堂免| 亚洲春色另类小说| 成人福利网站在线观看11| 亚洲天堂av电影| 久久久久久久久久久成人| 欧美精品一区在线播放| 日本成人免费在线| 色婷婷久久av| 欧美日韩免费观看中文| 欧美电影第一页| 97久久久久久| 黑人巨大精品欧美一区免费视频| 亚洲欧美日韩一区在线| 精品国产1区2区| 91精品久久久久久久| 欧美中文字幕第一页| 成人a在线观看| 国产精品白丝jk喷水视频一区| 日韩在线免费高清视频| 国产成人精品视频| 欧美亚洲第一区| 亚洲精品视频在线播放| 亚洲午夜久久久影院| 97精品久久久中文字幕免费| 日韩在线小视频| 欧美日本高清视频| 亚洲欧美中文日韩在线v日本| 狠狠躁天天躁日日躁欧美| 欧美夜福利tv在线| 国产精品69精品一区二区三区| 精品无码久久久久久国产| 国产精品高潮呻吟久久av无限| 91精品啪aⅴ在线观看国产| 97在线日本国产| 国产suv精品一区二区三区88区| 136fldh精品导航福利| 一区二区三区动漫| …久久精品99久久香蕉国产| 成人精品一区二区三区| 琪琪第一精品导航| 亚洲系列中文字幕| 亚洲欧美国产日韩天堂区| 久久精品国产综合| 国产亚洲成av人片在线观看桃| 国产在线精品成人一区二区三区| 日韩亚洲欧美中文在线| 久久99久久99精品免观看粉嫩| 日韩欧美在线第一页| 不卡在线观看电视剧完整版| 色av中文字幕一区| 国产精品免费久久久久影院| 国产精品小说在线| 清纯唯美亚洲激情| zzjj国产精品一区二区| 国产精品免费小视频| 国产精品黄页免费高清在线观看| 国产九九精品视频| 久久av在线看| 久久精品国产欧美亚洲人人爽| 久久视频在线观看免费| 91久久在线观看| 成人久久一区二区三区| 91精品国产综合久久久久久蜜臀| 中文.日本.精品| 中文字幕亚洲情99在线| 国产日韩中文字幕| 91理论片午午论夜理片久久| 欧美国产第一页| 2021久久精品国产99国产精品| 少妇精69xxtheporn| 成人天堂噜噜噜| 亚洲欧美综合精品久久成人| 久久福利网址导航| 久久久综合av| 久久精品视频一| 欧美激情三级免费| 国产精品久久97| 亚洲欧美日韩高清| 色偷偷av一区二区三区| 国产97在线|亚洲| 久久亚洲一区二区三区四区五区高| 欧美寡妇偷汉性猛交| 亚洲新中文字幕| 激情成人在线视频| 久久成人精品视频| 日韩视频免费观看| 97久久精品国产| 亚洲欧美日韩在线一区| 一区二区国产精品视频| 国产精品日韩久久久久| 亚洲成人av在线| 欧美电影免费观看大全| 亚洲2020天天堂在线观看| 亚洲日本中文字幕免费在线不卡| 亚洲а∨天堂久久精品喷水| 日韩欧美在线免费观看| 黄网站色欧美视频| 国产精自产拍久久久久久蜜| 欧美日韩国产一区在线| 久久精品亚洲国产| 色婷婷亚洲mv天堂mv在影片| 国产精品直播网红| 久久亚洲精品国产亚洲老地址| 欧美电影在线观看完整版| 国模吧一区二区| 欧美乱妇高清无乱码| 欧美亚洲另类制服自拍| 成人激情视频网| 在线亚洲男人天堂| 国产欧美一区二区三区在线看| 亚洲最大成人免费视频| 伊人精品在线观看| 92国产精品久久久久首页| 欧美极品少妇xxxxⅹ喷水| 97视频在线观看亚洲| 成人国产精品色哟哟| 最近中文字幕mv在线一区二区三区四区| 欧美日韩亚洲精品内裤| 亚洲影视九九影院在线观看| 高清欧美性猛交xxxx黑人猛交| 成人福利在线视频| 欧美专区第一页| 日本精品一区二区三区在线播放视频| 国产三级精品网站| 日韩中文字幕在线| 亚洲国产精品久久精品怡红院|