從乙個示例反思如何避免c 中的臨時物件

2021-10-05 20:36:24 字數 931 閱讀 7386

說明

臨時物件是隱晦的,但對效能的影響是不可忽視的。

本文通過剖析示例,找出臨時物件的藏身之所,**並消滅它。

示例**片斷如下:

string findaddr

(list l, string name)

}return"";

}

這段**簡單到不需要任何的注釋,且可能存在於任何規模的專案中。但,這裡面有多少處臨時物件?

剖析先說下答案吧,至少有 5處:

好了,看到了這些問題,也知道了正確的做法,修改版本如下:

string findaddr

(list

& l, string& name)

}return addr;

// 利用了rvo(返回值優化,函式的返回型別與區域性變數的型別完全一致時會啟用)

}

程式沒問題了,但對於標準容器使用遍歷式的迴圈,還是有點不順眼。

使用標準庫

讀過《effective stl》的小夥伴們,是不是也有種對手寫迴圈的反感?那就對了,因為可以使用演算法!

使用標準庫的演算法的好處就不多說了,直接上**:

string findaddr

(list

& l, string& name)

return addr;

// 利用了rvo(返回值優化,函式的返回型別與區域性變數的型別完全一致時會啟用)

}

一句話:利用標準庫的演算法,不要重複造輪子。這樣更好、更快、更強!

小結簡單的**中隱藏著這麼多的臨時物件,它們看不到,但我們必須要知道。

這對於效能提公升來說是必要的,因為只要簡單地改動就能達到。

注重效率,從寫**開始。

參考資料

《exceptional c++》

C 中enum的使用的乙個簡單示例

在c 中,switch 語句用得很多,但是,switch的引數比較單一,一般只支援int型,當switch 的引數是複雜的資料型別,如string或自定義的資料型別時,就需要enum對資料型別進行替代。如下面這個程式 include include class image image enum im...

乙個C 程式的示例 STATIC,FRIEND

include using namespace std class myclass static char str static void print void friend void printprivate myclass myclass private char mchar char mycl...

從乙個終端如何跟蹤另一終端的畫面

從乙個終端如何跟蹤另一終端的畫面 解答os 400系統支援從乙個顯示畫面跟蹤另乙個顯示畫面的功能,是乙個異地協助解決問題的好幫手,方法如下 這裡假設兩個顯示器都已經有使用者註冊 1 在畫面跟蹤請求端dspb顯示器使用命令strcpyscn srcdev dspa outdev dspb 按執行鍵後畫...