C記憶體管理一 概述

2021-06-22 18:50:06 字數 2092 閱讀 7935

我們寫了這麼多年的程式設計師,可能理論方面還比不上大學生。有人 "噓"我了,如果有能回答以下幾個問題的同學請舉手:

1.面試經常遇到:同學請說說堆疊的區別?

2.同學請說說乙個函式在堆疊中呼叫過程(首先要知道函式過程是儲存在什麼中的)。

3.靜態變數、全域性變數、區域性變數、常量等哪些是儲存在堆中,哪些是棧中,哪些是靜態區域中。

其實回答第乙個我問題,第二和第三問題就是........還真有人舉手。就算你舉手了,我也要講,有不對的地方,這幾位同學給我批評指正。

先來看圖:

就上圖來看堆疊區別是.......很明顯堆比棧大。(別噓),作業系統太高深此處省略,其它還有文字常量區、程式**區,在其他我也不知道有什麼此處省略。我們專門來看看 棧、堆、靜態儲存區。準備好了嗎?

堆--heap  棧--stack  最大的區別:乙個四個字母,乙個5個字母。

巨集觀上來說。棧是由系統提供的資料結果,而堆是由c/c++函式庫提供的。

從這句話中我的猜測理解是棧是系統提供和管理的,而堆是程式語言提供和管理的。在濃縮一下就是棧是自動管理的,而堆是手動管理的。

微觀上來說。堆疊就是一種方式,一種儲存資料的方式或者一種資料結構。

看它的定義:棧是一種先進後出的線性表,只要符合先進後出的原則的線性表都是棧。

而堆是一種二叉樹,有最大推、最小堆,我們常用的什麼冒泡、選擇等可以用於堆排序。

總之濃縮一下:

棧是系統自動管理、採用先進後出方式儲存資料的儲存區域。而堆是採用手動管理(malloc 和 free程式中建立、釋放)、採用二叉樹儲存資料的儲存區域。(特殊情況除外,比如棧也有動態分配和靜態分配)

棧是一種先進後出的線性表,只要符合先進後出的原則的線性表都是棧。

綜上:棧的特點就是快速、高效、但是由於是機器讀寫,靈活性相對較弱。堆由於可以手動大小分配,較為靈活、使用面廣泛,但是速度沒有棧快。

1、分配方式:自動、手動

2、速度、大小、響應速度:棧快、小,堆慢、大

3、資料儲存方式:先進後出、二叉樹

補充說明:靜態儲存區似乎給忘了,只要記住一點靜態儲存區是用來存放全域性變數和靜態變數的。

1、棧區(stack): 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 

例如,宣告在函式中乙個區域性變數 int b; 系統自動在棧中為b開闢空間例如:宣告在函式中乙個區域性變數 int b; 系統自動在棧中為b開闢空間

2、堆區(heap): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。

需要程式設計師自己申請,並指明大小,在c中malloc函式 如p1 = (char *)malloc(10); 在c++中用new運算子 如p2 = (char *)malloc(10); 但是注意p1、p2本身是在棧中的。例如:在c中malloc函式 

p1 = (char *)malloc(10); 

p1 = (char *)malloc(20); 

但是注意p1,p2本身是在棧中的。

到此我的猜測----棧中儲存的大部分是位址(還有寫少許的區域性變數值)。

3、全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 (程式結束後有系統釋放 ,即生命週期)

4、文字常量區 —常量字串就是放在這裡的。

5、程式**區—存放函式體的二進位制**。

程式說明:

int a = 0; //全域性初始化區 

char *p1; //全域性未初始化區 

[html]view plain

copy

print

?main()   

函式呼叫主要是在棧中進行的:在函式呼叫時,第乙個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語句)的位址,然後是函式的各個引數,在大多數的c編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。 當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。

C語言筆記系列 一 概述

設計特性 融合了控制特性的現代語言,可以表現出只要彙編才具有的精細控制能力 高效性 c程式緊湊且執行速度快 可移植性 在乙個系統上編譯的c程式經過很少改動或不修改可移植到另乙個系統,c編譯器大約在40多個系統可用 強大功能和靈活性 強大的unix系統大部分就是c寫的還有很多其他語言的編譯器是用c寫的...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...

型別庫(一) 概述

乙個使用者指南是一本書,一些書的集合就叫做庫了.在ole中,許多元素 物件,介面等等 型別資訊的集合就叫做型別庫 ole的型別資訊服務真正的是乙個建立和操作它包含的型別庫資訊的服務 庫本身只有少量自己的資訊,它主要關心儲存和取出在它內部的元素的型別資訊 所以,在極大程度上,型別庫充當圖書管理員的角色...