《EffectiveC++》讀書筆記(三)--- 儘量延後變量的定義

前言

心情不好就跑步,跑完步就寫寫博客,反正看到哪就寫哪.

正文

Item 26 : Postpone variable definitions as long as possible

儘量延後變量的定義,感覺有一種“惰性求值”的味道?

當我們定義的變量具有析構&構造函數時,一旦定義它我們就需要承擔析構和構造的成本,但是,如果並沒有用上它,或者在定義之後,發生某種錯誤,而直接return了,那麼就白白耗費了時間。

string cmd;
string name;
while(cin >> cmd){
    if(cmd == "get")
        cin >> name;
    if(cmd == "quit")// 直接退出,name完全沒用上,卻要構造和析構
        return;
}

同時,當我們需要必須要定義時,這表明我們已經爲這個對象的“出生”準備好了條件,否則,要先調用default構造函數,再copy構造,白白耗費一次default構造。

string cmd;
string name;//先default構造
while(cin >> cmd){
    if(cmd == "get")
        name = "kangkang"; //再copy構造
    if(cmd == "quit")
        return;
string cmd;
while(cin >> cmd){
    if(cmd == "get")
        string name("kangkang"); //直接copy構造
    if(cmd == "quit")
        return;
}

看到上面的代碼,可能會想到這樣一個問題:是在循環內每次定義一個變量,還是應該在循環外定義,然後直接賦值呢

A方案.在循環內定義,進行N次循環,我們就要耗費N**次構造+N次析構**。
B方案.在循環外定義,同樣N次循環,則是1次構造,1次析構,N次copy 賦值

很明顯,我們可以進行這樣的考慮:
對於作用域:A保證這個變量只作用於這個循環。而B則會將變量的作用域擴大
對於效率:如果一次 構造+析構 的成本高於一次 copy賦值 並且N很大,那麼B的效率更高。但如果,N值沒那麼大,或者構造+析構和copy賦值成本相近,那麼效率上並不會差很多。

所以,針對我們的程序,在對效率不敏感時,或者效率相差不大時,而且只在循環內需要用到變量,那麼我們就用A方案。而反之則B更加優先。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章