C 應用程式效能優化讀書筆記

2021-04-30 09:30:51 字數 2109 閱讀 6797

粗淺的看了下,有點虎頭蛇尾。暫且記下。

第一篇 c++程式優化基礎

第1章 c++物件模型

1.1 基本概念

1.1.1 程式使用記憶體區

乙個程式占用的記憶體區一般分為5種:全域性/靜態資料區、常量區、**區、棧、堆。

例子**:

#include

#include

int nglobal = 100;

int main(void)

常量儲存區是按4個位元組對齊的,堆上分配的記憶體是16個位元組對齊。

c/c++程式中的struct、union、class在編譯時也會對變數進行對齊處理。可以用#pragma pack()或者編譯

選項來控制struct、union、class的成員變數俺多少位元組對齊,或者關閉對齊。

1.1.2 全域性/靜態儲存區及常量資料區

下面這段**是錯誤的:

char *plocalstring = "localstring";    // 指向乙個字串常量

plocalstring[1] = a;    // 試圖修改不可修改的記憶體區

靜態變數在第一次進入作用域時被初始化。在同乙個類的多個物件之間共享資料,(可以使用全域性變數,但

會破壞類的封裝性),我們使用靜態變數。如下:

#include

#include

class a

;a~() ;

}   

int a::ncount = 0;

int main()

1.1.3 堆和棧

棧自動釋放;堆由開發人員釋放。

棧的大小是固定的,有編譯器決定,vs2003的預設值為1mb;堆只受限於系統有效的虛擬記憶體。

棧的效率較高不產生碎片;堆效率低,容易產生碎片。

1.1.4 c++中的物件

物件的三種建立方式:

1) 通過定義變數建立

2) 通過new操作符建立

3) 通過實現建立物件:這種情況一般是指一些隱藏的中間臨時變數的建立和銷毀。

它們的生命週期很短,也不易被開發人員發覺,但常常是造成程式效能下降的瓶頸

。#include

class a

a(a& a)

~a()

};a foo(a a)

int main(void)

結果如下:

a create.

a create with copy

a create.

a create with copy

a destroyed.

a destroyed.

a destroyed.

a destroyed.

press any key to continue   

原因:foo()的引數和返回值都是通過值傳遞的。在呼叫foo()的時候,需要把實參複製乙份,壓入foo()的

棧中,返回值也要複製乙份放在棧中。

解決辦法:可以通過傳遞引用的方式來解決,即a foo(a& a)。返回值則可以根據情況返回指標或引用,也

可以增加乙個指標型別的引數作為函式的輸出。

在c++軟體開發中:還會有大量其他型別的隱性臨時物件存在,如過載+以及++等操作符。

當乙個派生類例項化乙個物件時,會先構造乙個父類物件。同樣在銷毀乙個派生類的物件時,要首先銷毀其

父類物件。如果構造父類物件的開銷很大,會造成所有子類的構造都有很大的開銷。

1.3 c++物件的記憶體布局

1.3.1 簡單物件

簡單c++物件記憶體布局:

1) 非靜態資料成員是影響物件佔據記憶體大小的主要因素(4位元組對齊)

2) 靜態資料成員不佔物件記憶體

3) 靜態成員函式和非靜態成員函式不會影響記憶體的大小

4) 如果物件中包含虛函式,會增加4個位元組的空間,不管有多少個虛函式

虛函式表vtale中不必完全是指向虛函式實現的指標。當指定編譯器開啟rtti開關時,vtable中的第乙個

指標指向的是乙個typeinfo的結構,每個類只產生乙個typeinfo結構的例項。當程式呼叫typeid()來獲取類的資訊時

,實際上就是通過vtable中的第乙個指標獲得了typeinfo。

1.3.2 單繼承

一些**:

C 應用程式效能優化

本文選自c 應用程式效能優化 第2版 一書 總 序 去國離家十六載後,2006年,當我再次歸來凝視上海這座不夜城時,不由地感慨世界真的變小了 變平了,中國作為地球村的一員,正以驚人的速度發展變化著。世界正改變著中國,中國也不斷影響著世界。在備感欣喜振奮之餘,我亦常常思索,在乙個越來越小 越來越平的世...

C 應用程式效能優化

本文選自一書 總 序 去國離家十六載後,2006年,當我再次歸來凝視上海這座不夜城時,不由地感慨世界真的變小了 變平了,中國作為地球村的一員,正以驚人的速度發展變化著。世界正改變著中國,中國也不斷影響著世界。在備感欣喜振奮之餘,我亦常常思索,在乙個越來越小 越來越平的世界裡,中國會面對怎樣的挑戰和機...

WPF 應用程式效能優化

開發效率 能使用xaml實現的就不使用者cs後台程式編寫 資料繫結 資料繫結使用的是屬性,不是字段 public observablecollectionlist new observablecollection dispatcher.invoke dispatcherpriority.backgr...