變數空間分配 堆 棧

2022-08-23 23:57:11 字數 1219 閱讀 1316

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

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

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

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

4、文字常量區—常量字串就是放在這裡的。 程式結束後由系統釋放

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

堆與棧的討論:

管理方式:

堆中資源由程式設計師控制(容易產生memory leak)。

棧資源由編譯器自動管理,無需手工控制。

系統響應:

對於堆,應知道系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式申請時,遍歷該鍊錶,尋找第乙個空間大於申請空間的堆結點,刪除空閒結點鍊錶中的該結點,並將該結點空間分配給程式(大多數系統會在這塊記憶體空間首位址記錄本次分配的大小,這樣delete才能正確釋放本記憶體空間,另外系統會將多餘的部分重新放入空閒鍊錶中)。

對於棧,只要棧的剩餘空間大於所申請空間,系統為程式提供記憶體,否則報異常提示棧溢位。

空間大小:

堆是不連續的記憶體區域(因為系統是用鍊錶來儲存空閒記憶體位址,自然不是連續的),堆大小受限於計算機系統中有效的虛擬記憶體(32bit系統理論上是4g),所以堆的空間比較靈活,比較大。

棧是一塊連續的記憶體區域,大小是作業系統預定好的,windows下棧大小是2m(也有是1m,在編譯時確定,vc中可設定)。

碎片問題:

對於堆,頻繁的new/delete會造成大量碎片,使程式效率降低。

對於棧,它是乙個先進後出的佇列,進出一一對應,不會產生碎片。

堆向上,向高位址方向增長。

棧向下,向低位址方向增長。

分配方式:

堆都是動態分配(沒有靜態分配的堆)。

棧有靜態分配和動態分配,靜態分配由編譯器完成(如區域性變數分配),動態分配由calloc函式分配,但棧的動態分配的資源由編譯器進行釋放,無需程式設計師實現。

分配效率:

堆由c/c++函式庫提供,機制很複雜。所以堆的效率比棧低很多。

棧是極其系統提供的資料結構,計算機在底層對棧提供支援,分配專門暫存器存放棧位址,棧操作有專門指令。

使用freertos如何確定分配堆疊空間大小

首先要配置freertos的堆 heap 空間,建立任務我們還需要為每個任務分配棧 stack 空間,那麼針對freertos的堆疊空間到底該如何確定?freertos從v9版本以後同時支援靜態記憶體和動態記憶體分配方式。靜態記憶體分配在編譯時候就會對freertos的核心物件分配ram空間。動態分...

堆 棧 全域性變數的分配位址

二 c語言程式裡全域性變數 區域性變數 堆 棧等概念,在keil中針對stm32系統進行程式設計,除錯變數,進行驗證 通過串列埠輸出資訊到上位機,進行驗證。include include int k1 1 int k2 static int k3 2 static int k4 intmain 棧區...

C 記憶體布局 變數在堆疊的分配

1.變數的記憶體分布 const變數儲存在.rodata read only 區域 char p abcd p指向的是靜態文字區域.text rodata 和 text 被合併為乙個segment,由os保護起來,只可讀。register變數存放在.bss區域 區域性變數存放在棧空間,static變...