關於掌握C 的記憶體堆疊概念

2022-07-09 03:12:09 字數 879 閱讀 3108

很多時候,我們使用c#語言書寫業務邏輯時,並不會太多地主動考慮到記憶體的占用和分配問題,但編的程式多了,就總會遇到一些效能問題。提到"效能"二字,就不得不考慮cpu和記憶體,而提到記憶體占用和使用效率,就不得不提到「堆疊」。於是我就想把堆疊這個概念徹底弄明白,於是打算寫一篇文章記錄下自己理解的過程。由於也是進行學習分享,所以我不想長篇累牘地去將其它人的文章內容抄取回來,只想把「讀懂」的過程寫出來,以便將來繼續接續現在的理解進行深入研究。

首先,還是先說一下概念吧。

執行緒堆疊:簡稱棧 stack,是一種後進先出的資料結構,當使用時,都是從棧頂取起;之所以叫它執行緒堆疊,是因為在程式執行時,每個執行緒(thread)都會維護乙個自己的專屬執行緒堆疊,它儲存的型別包括了值型別、指標、cpu指令等,關於詳細的過程,可以鏈結到這個文章"**c#中堆和棧的區別(附上**)"。

託管堆:簡稱堆 heap,堆是一種經過排序的樹形資料結構,每個結點都有乙個值,在程式執行時,我們宣告的引用型別物件new操作所申請的記憶體空間,就是堆上的節點,使用時,通過棧上的指標從中提取資料。

這二者的區別是,stack是不受控制的,而且比起託管堆來說,空間是很有限的,他是編譯時申請好的一片記憶體使用區域(參照上面執行緒堆疊的定義及鏈結文章中的說明),不需要我們用程式管理也不會被gc所**;堆則不同,他需要gc來進行清理,如果不清理則會一直存在,直到再次呼叫這個節點時發生記憶體洩露錯誤(那麼這時引入第二篇文章,方便讀者您繼續將這二者的區別弄明白「資料結構的堆和棧」)。

那麼,概念就是這樣了,然後需要弄明白的主要問題就是,如何通過在程式設計中考慮堆疊和託管堆的高效合理使用,來提公升我們寫的程式的執行效率。

c 面試 堆疊記憶體

乙個由c c 編譯的程式占用的記憶體分為幾個部分 2 堆區 heap 一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由os 值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的鍊錶。3 全域性區 靜態區 static 也叫靜態資料記憶體空間,儲存全域性變數和靜態變數...

關於C 中的堆 棧

乙個c 程式設計占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配 釋放,存放函式的引數值,區域性變數值。操作方式類似資料結構中的stack。2 堆區 heap 一般由程式設計師分配 釋放。如果程式設計師未釋放,一般由os在程式結束時 同資料結構中的堆不同,分配方式類似鍊錶。3 靜...

堆疊和記憶體的關係(C )

五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...