C 效能的程式設計技術

2021-05-23 12:20:47 字數 2212 閱讀 9445

一.影響

c++效能的基本原理:

1.i/o

的開銷是最昂貴的

2.函式呼叫的開銷是乙個因素,因此我們應該內聯短小,頻繁呼叫的函式

3.複製物件的開銷是昂貴的。最好選擇按引用傳遞,而不是值傳遞。

4.最好採用棧內建立物件,而不是採用堆建立物件

一般在堆內建立物件是在棧內建立物件花費的時間是

20備左右。

5.理解每種操作的代價。

二.臨時物件:

產生臨時物件一般來說有如下兩種場合。

(1)當實際呼叫函式時傳入的引數與函式定義中宣告的變數型別不匹配。

(2)按值傳遞

(3)當函式返回乙個物件時

class rational

private:

int m;

int n;

}rationalr1(100);

rationalr2= rational(100);

rationalr2=100;//

兩次構造和一次析構

優化方式:

1.傳值和傳引用

2.返回引用

3.建構函式申明為

explicit

並過載+,-

,=之類的運算子。

三.內聯:

函式呼叫的開銷:

void foo

()呼叫者(這裡是foo)在呼叫前需要執行如下操作。

(1)引數壓棧:這裡是a、b和c。壓棧時一般都是按照逆序,因此是c->b->c。如果a、b和c有物件,則需要先進行拷貝構造。 ②

處語句的位址。

(3)儲存維護foo函式棧幀資訊的暫存器內容:如sp(堆疊指標)和fp(棧幀指標)等。到底儲存哪些暫存器與平台相關,但是每個平台肯定都會有對應的暫存器。

(4)儲存一些通用暫存器的內容:因為有些通用暫存器會被所有函式用到,所以在foo呼叫func之前,這些暫存器可能已經放置了對foo有用的資訊。這些暫存器在進入func函式體內執行時可能會被func用到,從而被覆寫。因此foo在呼叫func前儲存乙份這些通用暫存器的內容,這樣在func返回後可以恢復它們。

接著呼叫func函式,它首先通過移動棧指標來分配所有在其內部宣告的區域性變數所需的空間,然後執行其函式體內的**等。

最後當func執行完畢,函式返回時,foo函式還需要執行如下善後處理。

(1)恢復通用暫存器的值。

(2)恢復儲存foo函式棧幀資訊的那些暫存器的值。

(3)通過移動棧指標,銷毀func函式的棧幀,

(4)將儲存的返回位址出棧,並賦給ip暫存器。

(5)通過移動棧指標,**傳給func函式的引數所占用的空間。

缺點:增大**編譯後長度

對於小型的,頻繁呼叫的函式,而對於很長的函式基本上不適用

四.記憶體池

new/delete

或malloc/free在堆上分配和釋放記憶體的開銷: 1.

在堆上分配記憶體有額外開銷。 2.

造成記憶體碎片,影響系統效能。

應用例項:

linux slab

分配器,

apache

記憶體池設計考慮固定大小還是變長,單執行緒還是多執行緒。

六.快取

更新策略

fifo lrulfu

memcache

五.理解

stl的應用場合

vector

動態陣列,記憶體空間是連續的

list

雙向;列表

multiset

按序排列的容器,內部採用紅黑樹

陣列vector

list

multiset

原因後端插入

70ms

250ms

930ms

6500ms

vector

動態增長時所帶來的開銷

list

指標所帶來的開銷

後端刪除

60ms

750ms

list

指標操作所帶來的開銷

前端刪除

700ms

7ms複製所帶來的開銷

遍歷(110ms

110ms

2600ms

區域性性原理指標訪問的開銷

查詢40ms

40ms

800ms

0.06ms

list

程式區域性性原理指標訪問的開銷

multiset

紅黑樹高效查詢

提高C 效能的程式設計技術

當乙個物件確實被需要的時候才建立它。物件的建立 或銷毀 觸發對父物件和成員物件的遞迴建立 銷毀 要當心複雜層次中物件的復合使用。它們使得建立和銷毀的開銷更為高昂。初始化成員變數使用顯式構造。class ftest private std wstring str 只能在執行期間解析的虛函式是不允許使用...

C 模板元程式設計技術

模板元程式設計 template metaprogramming 更準確的含義應該是 編 可以程式設計序的 程式 而模板元程式 template metaprogram 則是 可以程式設計序的 程式 也就是說,我們給出 的產生規則,編譯器在編譯期解釋這些規則並生成新 來實現我們預期的功能。讓我們來看...

c 程式設計技術之 初衷

從開始接觸計算機這個行業,到現在已經接近十年了,最大的感觸就是 自己費盡心思得到的結論,由於專案進度的原因,總不能很好的總結,當再次用到的時候,發現忘個差不多了。雖然基本思想還是清楚的,但是思想到應用還是有一段距離的 在這個行業,時間就是金錢,工作其實蠻簡單的,無非就是迴圈和判斷。但前提是你要徹底理...