C 記憶體分割槽

2021-10-01 14:23:14 字數 2486 閱讀 8666

前言:最近正在學習有關static的知識,發覺對c++的記憶體分割槽不是很了解,上網查了很多資料,遂將這幾天的學習筆記進行了簡單整理,發表在這裡

• 棧區(stack):主要用來存放函式的引數以及區域性變數。棧區由系統進行記憶體管理,在函式完成執行時,系統會自行釋放棧區的記憶體,而不需要使用者參與管理。整個程式的棧區的大小可以在編譯器中由使用者自行設定,預設的棧區大小為3m

• 堆區(heap):由使用者手動申請,手動釋放。如果使用者忘記對其所申請的記憶體資源進行釋放,該記憶體資源可能會在程式結束時由作業系統(os)進行釋放(也可能不會)

[注意]:

1.c++系統記憶體分割槽中的堆和資料結構中的堆是不同的,但c++記憶體分割槽中的堆對系統資源的分配方式和資料結構中的鍊錶卻十分相似

2.在c中使用者通常用malloc進行記憶體的申請,用free進行記憶體的釋放;而在c++中使用者通常用new進行記憶體的申請,用delete進行記憶體的釋放(c++同樣支援malloc/free方式)。

3.通常認為c++中有兩個動態記憶體區域。通過new/delete方式進行記憶體資源的分配和釋放的稱為自由儲存區(free

store),而通過malloc/free方式進行記憶體資源的分配和釋放的稱為堆區(heap)。但本質上來說很多編譯器中的new操作符是通過malloc進行記憶體申請的,因此可以將堆區理解為自由儲存區的乙個具體實現,雖然二者不完全相同,但很多時候可以混為一談。(如果想細究堆區和自由儲存區的不同,可以參考這個部落格:

4.new與malloc的幾點不同:

• malloc是c語言中的函式,而new是c++中的操作符

• malloc申請之後返回的型別是void*,而new返回的指標則是帶有特定資料型別的

• malloc只負責記憶體的分配而不會呼叫類的建構函式,而new不僅會分配記憶體,而且會自動呼叫類的建構函式

• 靜態區(全域性區)(static):用來存放程式的全域性變數和靜態變數在c語言中,初始化的全域性變數和靜態變數放在一塊記憶體區域中,而未初始化的全域性變數和靜態變數放在與之相鄰的另一塊記憶體區域中。而在c++中則沒有在靜態區中將初始化的和未初始化的變數進行分開儲存,因為c++會對未初始化的全域性變數和靜態變數進行預設初始化(一般預設初始化為0)。該區域儲存的資料會在程式結束後由系統來釋放。

[注意]:

全域性變數和靜態全域性變數在c++中的儲存方式是一樣的,但不同的是全域性變數在整個源**中都是可以使用的,而靜態全域性變數只能在當前檔案中使用。比如乙個程式有3個檔案a.cpp、b.cpp和c.cpp,如果在檔案a.cpp中定義了乙個全域性變數x,那麼該變數x在檔案a.cpp、b.cpp和c.cpp中都可以使用;但如果在檔案a.cpp中定義了乙個靜態全域性變數y,那麼該變數y只能在檔案a.cpp中使用檔案b.cpp和檔案c.cpp都不可以使用該靜態全域性變數y

• 常量儲存區:用來儲存程式中的常量,比如const常量,字串常量等都儲存在這個區域。該區域儲存的資料會在程式結束後由系統來釋放

[注意]:

1.在程式執行期間,該區域中儲存的常量是全域性可見的。

2.當我們定義char *ptr="tomwenxing"時,字串「tomwenixng」就儲存在這個區域

• **區:存放程式體的二進位制**。比如我們在程式中自定義的函式,其函式體就是以二進位制**的形式儲存在這個區域的

• 例項:

1 #include

2 #include

3using

namespace

std;

4int value1=10;//全域性變數:儲存在靜態區(全域性區)5

const

int value2=10;//const常量:儲存在常量區

6

static

int value3=10;//static變數:儲存在靜態區 (全域性區)

7

8//函式func:儲存在**區9

void func(int a)

1415//函式main:儲存在**區16

intmain()

c 記憶體分割槽

堆 由程式設計師手動分配和釋放,完全不同於資料結構中的堆,分配方式類似鍊錶。由malloc c語言 或new c 來分配,free c語言 和delete c 釋放。若程式設計師不釋放,程式結束時由系統釋放。棧 由編譯器自動分配和釋放的,存放函式的引數值 區域性變數的值等。操作方式類似資料結構的棧。...

C 記憶體分割槽

程式編譯後生成的二進位制檔案放在記憶體中的 區 全域性變數 函式外宣告的變數 靜態區域性變數 static修飾的變數 常量字串常量 hello world const 全域性變數 全域性常量 note const修飾的區域性變數不在全域性區 且區域性變數也不在全域性區 區域性變數 函式引數 存放在棧...

C 記憶體分割槽

系統執行時不能所有資料都讀取到cpu暫存器,所以需要有快取,快取不夠用了所以有多級快取。快取的儲存器畢竟還是相對昂貴的,所以還有記憶體 也叫外存 但是資料在記憶體中的是怎樣存放,這又是乙個問題。首先從位元組層面看 資訊在計算機肯定是0 1的bit位元位形式儲存,習慣是8bit作為乙個位元組作為乙個有...