c++可優化的細節非常多,從這次起開始乙個個的說明一下,有些是來自書本,有些來自經驗 ,有些來自網上的其它的一些資料,優化的方法是相同的,所以只介紹原理和方法。針對c++11及後續的c++新的版本庫的一些特點,會對一些優化的細節進行綜合說明。
字串變數的優化是最常見的,也是最容易被忽略的。這裡舉乙個簡單的例子:
void test(const std::string &s)
}
如果用第一種的話,會產生臨時字串變數,也就是說分配記憶體n次,導致開銷增加,在資料量巨大時,不可小覷。此外,這種連線表示式也會產生不必要的臨時變數的產生,導致記憶體分配的增加。但是,在c++11的環境下,優秀的編譯器會對此進行優化,利用移動建構函式來實現高效的指標複製。
如果涉及到大量的字元的處理,建議採用c的形式來處理而不是採用c++的字串處理,這樣雖然有點小麻煩,但是效率是最高的。
std::vectorvec;
提前處理一下記憶體
for (int num =0;num < 10000;num++)
在迴圈比較小的情況下,vector的記憶體再次分配造成的開銷是可以容忍的,如果大到一定程式,連續的記憶體分配和資料拷貝會極大的降低效能。可以用reserve來提前處理一下記憶體長度(注釋部分),讓其和相關的實際資料匹配。
這個非常容易理解,如果向乙個函式傳遞乙個擁有較大的記憶體變數時,或者需要返回乙個此類的物件時,臨時物件的複製開銷也是相當巨大的。因此,可以考慮使用引用或者指標來搞定,看下面的例子:
typedef struct __list__
mylist,*pmylist;
mylist getvalue(mylist oldlist)
int getvalue(mylist &old,mylist &new)
這樣會大幅的減少臨時變數的開銷,提高效率。
在c++11實現了移動語義後,拷貝建構函式的引用可以不再使用了,類似如下:
class string
;
這裡總結得很唐突,只是想把這個開乙個頭,好不斷的向前推進整個優化的總結。一點點先記下來,回頭再整體統一進行整理。 《C 應用程式效能優化》之程式記憶體
乙個程式占用的記憶體區通常分5種,如下 全域性 靜態資料區 儲存全域性變數和靜態變數 常量資料區 儲存程式中的常量 字串等,不可修改 區 儲存 資料 棧 儲存自動變數 區域性變數,傳遞引數 堆 使用者控制的儲存區,儲存動態產生的資料 程式在分配記憶體時為了加快訪問速度,採取的一種分配策略。每個特定平...
C 應用程式效能優化 作業系統記憶體管理
1.工作集 概念 作業系統中駐留在物理記憶體中的記憶體頁成為程序的工作集。工作集的大小 作業系統為每個程序定義了最小工作集 20 50mb 和最大工作集 45 345mb 具體與系統的物理記憶體大小有關 工作集的增長 當執行到未被調入記憶體的 頁或資料頁時,這些頁會被調入記憶體,工作集隨之增長。當工...
構建用於C 應用程式的應用商店(一)
我在就職的公司開發工具型軟體,桌面版的,我們公司有各種工具軟體的需求。現在我已經記不清我生產了多少了。我相信再過一段時間,也許幾個月,也許一年後,我也會記不住之前開發過什麼,或許有一定的類別的印象,但是具體是什麼,執行的樣子就會像現在記不起以前開發的軟體一樣,都記不清了。這些工具沒有完整的統計功能,...