動態區域(棧 堆) 靜態儲存區(資料段和程式段)

2021-09-26 20:52:13 字數 2512 閱讀 4626

內容收集比較混亂,僅供參考

1 類成員變數存放在堆區,所有類的例項和陣列都是在堆上分配記憶體的,堆記憶體由存活和死亡的物件,空閒碎片區組成,物件所佔的堆記憶體是由自動記憶體管理系統**;

2 堆允許程式在執行時動態地申請某個大小的記憶體。

3 一般由程式設計師分配釋放,若程式設計師不釋放,則可能會引起記憶體洩漏。

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

存放函式體的二進位制**,所有的語句編譯後會生成cpu指令儲存在**區.

1 唯讀資料段:文字常量區

唯讀資料段是程式使用的一些不會被更改的資料,使用這些資料的方式類似查表式的操作,由於這些變數不需要更改,因此只需要放置在唯讀儲存器中即可。一般是const修飾的變數以及程式中使用的文字常量一般會存放在唯讀資料段中。

2 已初始化的讀寫資料段:全域性區(靜態區)

已初始化資料是在程式中宣告,並且具有初值的變數,這些變數需要占用儲存器的空間,在程式執行時它們需要位於可讀寫的記憶體區域內,並且有初值,以供程式執行時讀寫。在程式中一般為已經初始化的全域性變數,已經初始化的靜態區域性變數(static修飾的已經初始化的變數)

3 未初始化段(bss):

未初始化資料是在程式中宣告,但是沒有初始化的變數,這些變數在程式執行之前不需要占用儲存器的空間。與讀寫資料段類似,它也屬於靜態資料區。但是該段中資料沒有經過初始化。未初始化資料段只有在執行的初始化階段才會產生,因此它的大小不會影響目標檔案的大小。在程式中一般是沒有初始化的全域性變數和沒有初始化的靜態區域性變數。

1 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,   未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統釋放。  

2 方法區又叫靜態儲存區,存放class檔案和靜態資料,執行緒共享

1 常量占用記憶體,唯讀狀態,決不可修改

2 常量字串就是放在這裡的,程式結束後由系統釋放常量 

3 常量區放未經new的常量

linux程序的記憶體空間按照從高到低的順序,儲存的依次是

bss段:bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。 

資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。 

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。 

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減) 

棧(stack):棧又稱堆疊,是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

自由儲存區:就是那些由 new 分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個 new 就要對應乙個 delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。堆可以動態地擴充套件和收縮。

全域性/靜態儲存區:全域性變數和靜態變數被分配到同一塊記憶體中,在以前的 c 語言中,全域性變數又分為初始化的和未初始化的(初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數與靜態變數在相鄰的另一塊區域,同時未被初始化的物件儲存區可以通過 void* 來訪問和操縱,程式結束後由系統自行釋放),在 c++ 裡面沒有這個區分了,他們共同占用同一塊記憶體區。

常量儲存區:這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多)

參考:[1] 動態儲存區(棧、堆)、靜態儲存區(資料段和程式段)

[2].bss段和.data段資料分析

[3]論述下c/c++中的堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區,**段 資料段 .bss段.

[4] c++記憶體分配方式詳解(堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區)

動態儲存區 靜態儲存區 堆和棧的區別

動態儲存區 靜態儲存區 堆和棧的區別 記憶體中使用者儲存空間的分配情況 三種 程式區 存放程式語句 靜態儲存區 動態儲存區 動態儲存方式 動態儲存區 棧 由編譯器自動分配釋放,存放函式的引數值,區域性變數等值。其操作方式類似於資料結構中的棧。會存放函式的返回位址 引數和區域性變數 堆 一般由程式設計...

靜態儲存區 堆區和棧區

記憶體分配有三種 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式 包括main函式 內區域性變數的儲存單元都可以在棧上建立,函式執行結束時...

關於靜態儲存區域 棧 堆

有關動態物件建立 一般來說,編譯器將記憶體分為三部分 靜態儲存區域 棧 堆。靜態儲存區主要儲存全域性變數和靜態變數,棧儲存呼叫函式相關的變數 位址等,堆儲存動態生成的變數,在c中是指由malloc,free運算產生釋放的儲存空間,在c 中就是指new和delete運算子作用的儲存區域。昨天才看ppt...