《C 應用程式效能優化》之程式記憶體

2021-07-23 22:27:53 字數 1172 閱讀 5538

乙個程式占用的記憶體區通常分5種,如下:

全域性/靜態資料區:儲存全域性變數和靜態變數

常量資料區:儲存程式中的常量、字串等,不可修改

**區:儲存**資料

:儲存自動變數、區域性變數,傳遞引數

:使用者控制的儲存區,儲存動態產生的資料

程式在分配記憶體時為了加快訪問速度,採取的一種分配策略。每個特定平台上的

編譯器都有自己的預設「對齊係數」(也叫對齊模數)。程式設計師可以通過預編譯

對齊規則:

1、資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。

2、結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行

3、結合1、2可推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

棧上的記憶體由程式自行管理(即自動分配,自動銷毀),所以不存在記憶體洩漏問題;而堆上的記憶體則是由開發人員進行處理。通過new/malloc申請的記憶體是堆上的記憶體,因此需要使用指標記錄記憶體的位置,但需要注意的是這個指標本身卻是儲存在棧上記憶體中的,因此程式結束時,指標記憶體被自動釋放,但是指標指向的堆上的記憶體未被釋放,於是就產生了記憶體洩漏,因此,在程式結束前必須使用delete/free釋放堆上的記憶體。

除此之外,對於乙個程式而言,一般來說,棧的大小是固定的,由編譯器決定,通常棧不大。

在vs中可以通過專案屬性->配置屬性->系統->堆疊保留大小,設定棧大小,如圖。

另外乙個顯著區別是效率,棧記憶體由系統分配,有特定的壓棧、出棧指令,操作在棧頂進行,比較快,同時由於棧的規則是先進後出,比較符合變數作用域或者說生存期的特點,(作用域層層遞進時,就是作用域內變數的一次次壓棧)。而堆記憶體由開發人員自主申請,系統分配記憶體時需要根據特定的演算法對記憶體區進行檢索,找到合適大小的記憶體塊,然後返回其位址,效率比棧低且易產生碎片。

C 應用程式效能優化

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

C 應用程式效能優化

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

WPF 應用程式效能優化

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