「C++」提升程序效率的小方法

溫馨提示:很多手機瀏覽器,比如百度app,都可以語音播報本網(wǎng)頁。方法打開本網(wǎng)頁之后,點擊 APP下方或上方"功能"按鈕,里面有一個"語音播報"按鈕,點擊即可收聽。

在開發(fā)feature 的過程,除了功能正確,性能優(yōu)化應該是每個工程師相當重視的課題,優(yōu)化不只包含了演算法、流程、架構(gòu)等大方向的改良,如果能在日常寫code 時改變一下寫法,不知不覺中也能提升不少性能喔!

這篇文章用來記錄我收集來的幾個提升程序效率的小方法,分享給同樣寫C++的朋友,之后如果有收集到其他小技巧會持續(xù)更新這篇文章

參數(shù)傳遞時盡量使用call by reference

通常來說,參數(shù)在沒特別指定的情況下傳遞給函式時,會以call by value 的方式,也就意味著程序會呼叫copy constructor 產(chǎn)生一個參數(shù)的副本傳入。而當函式返回時,這個臨時的副本也會隨之消滅并呼叫相對應的destructor ,當物件變得相當巨大且復雜時,傳遞參數(shù)的成本會變得相當昂貴。

為了避免性能受到影響,如果傳遞參數(shù)的類型不屬于built-in types 、iterator 、function object ,就盡量使用call by reference 吧!

使用std::move 當你需要將資源轉(zhuǎn)移給其他人

在C++11之前,如果想要把變數(shù)資源轉(zhuǎn)移給另一個物件,只能通過copy constructor,先產(chǎn)生不必要的臨時對象,復制完后再將此臨時物件銷毀。而通過C++11 提供的std::move 可以將lvalue 轉(zhuǎn)換成rvalue reference,以便后續(xù)呼叫物件的move constructor 進行轉(zhuǎn)移,避免產(chǎn)生副本的成本。

現(xiàn)在大部分的container 都已經(jīng)提供move constructor method,需要把資源轉(zhuǎn)移時不妨使用std::move 的方式傳入。

多使用直接初始化

簡單來說,賦值初始化會比直接初始化多創(chuàng)建一個臨時物件,不過似乎在沒有編譯器最佳化的情況才會有差異,大家可以視情況使用。

挑選適合的文件結(jié)構(gòu)

不同的文件結(jié)構(gòu)或演算法之間可能會忽相抵觸,最常見的就是空間與時間的取舍,在決定演算法時,這是工程師得時刻面臨到的權(quán)衡問題。

以文件結(jié)構(gòu)為例,C++ 提供了非常多的container,每個container 有各自的特性,包含元素是否需要保持順序( vector or set)、是否可接受重復數(shù)據(jù)( map or set ), 是否需要考慮插入與查詢的效率。

開發(fā)程序時必須先了解工具的特性才能選擇最適合的一種來解決問題!

善用智慧指標

在還沒有智慧指標之前,必須仰賴工程師自己new/delete 資源,然而在開發(fā)過程中很容易因為一時疏忽導致程序內(nèi)存泄漏,智慧指標可以大幅降低開發(fā)過程中鬼遮眼的情況。

使用智慧指標建立物件時,可以使用make_unique、make_shared 的方式,效率會比使用new 還來的好,因為少掉了一次物件的建立。

另外,像是handle 這種windows 的核心物件,使用完畢必須把相關(guān)的資源釋放,針對這類型的資源管理,除了通過RAII 模式去確保資源的安全性,也可以使用智慧指標實作喔!

Pimpl 減少編譯相依性

當你需要縮短整體項目編譯時間時,通過Pimpl 技術(shù)可以把private 成員封裝起來,通過指標的方式存取。這樣一來,header 不須include 跟私有成員相關(guān)的項目,除了減少項目的耦合,也避免了私有成員產(chǎn)生變動時,與之相關(guān)的所有cpp 檔得跟著重新編譯。

使用更好的library

目前許多開源項目提供許多效率更好且更易于使用的library,像是c++11 部分引入的boost 就提供很多比原生還好用的檔案系統(tǒng)與演算法,或是你的程序需要高性能的平衡需求時,可以考慮采用intel TBB 開發(fā)等等。

比起再造輪子,好好善用網(wǎng)絡資源,根據(jù)自己的開發(fā)需求選擇最適合的工具,不論是ML、 UI、Graph 等各種領域,都可以搜尋到好用的開源庫。熱門的開源庫大部分也能找到相關(guān)的性能跑分與優(yōu)缺比較,可以根據(jù)自己的開發(fā)需求做選擇。

如果以上有不正確需要修正的部分,或是你們也有一些小技巧可以跟我分享的,歡迎大家底下留言一起交流~

#C語言初學#


轉(zhuǎn)載原文地址:https://baijiahao.baidu.com/s?id=1709064604575992272

作者:百家號四川人在香港

聲明:本文僅代表作者觀點,不代表本網(wǎng)站平臺立場