粗淺的看了下,有點虎頭蛇尾。暫且記下。
第一篇 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...