對記憶體中儲存區域的再認識

2021-07-11 22:20:45 字數 970 閱讀 4961

在開始學習程式設計的時候,我們不會再定義變數時考慮過多,但是隨著學習的深入,知道我們遇到了const static 指標....。這些常常涉及到記憶體區域的時候,我們顯得十分無知。

程式中的動態儲存區/靜態儲存區/堆疊究竟是什麼東西?

所謂靜態,就是一定會存在的而且會永恆存在、不會消失,這樣的資料報括常量、常變數(const 變數)、靜態變數、全域性變數等。

動態的話,就是會變化的了。動態的區域,就是堆和棧。這個棧應該稱作 call stack,上面會存放函式的返回位址、引數和區域性變數。而堆放就是我們通過 new 算符和 malloc 函式分配得到的空間。

static code and data - this is all the compiled code plus all static data。

dynamic data - this is memory that is allocated during program execution。

這兩句話的大概意思就是:靜態變數編譯的時候才分配記憶體;動態分配記憶體是在程式執行的時候分配記憶體。

程式設計師通過語句,給陣列或結構等變數分配記憶體。通常在執行開始時,程式設計師並不知道陣列將要有多少元素,而是執行時由使用者輸入的。動態分配(malloc)的記憶體,當不需要用時可以取消。當需要再次增加單元時可以增加(realloc)。
l儲存空間的組成部分

¡正文段  由cpu執行的機器指令構成,共享+唯讀。 ¡

初始化資料段 

資料段,由程式中已賦初值的靜態變數構成。

¡非初始化資料段

bss段,在程式開始執行之前,核心將此段初始化  為0。

¡棧 自動變數、引數、函式呼叫的場景資訊(如返回  位址、暫存器值)。

¡堆進行動態儲存分配,位於非初始化資料段頂和棧  底之間。

類的記憶體儲存區域

眾所周知,new出來的變數,申請的記憶體都是儲存在堆區 理論上來說是這樣子的,但是有時候看到int i 千萬不要脫口而出是棧記憶體,因為不一定,尤其在c 類中,需要重點注意。如下 class cls memory include cls memory.h cls memory cls memory ...

jvm 物件在記憶體中儲存的布局

jvm 物件在記憶體中儲存的布局有三部分 物件頭 例項資料 對齊填充。1 物件頭 執行時資料 型別指標 陣列長度。1 執行時資料 hashcode雜湊碼 鎖狀態標誌 執行緒持有的鎖 gc年齡分代等,有些不是固定不變的,在執行時會根據當時的狀態進行修改。2 型別指標 指向方法區中型別資訊的指標。型別資...

有關字元常量儲存引起的資料在記憶體中儲存的若干問題

字串常量,放在哪個儲存區呢?是 自動儲存區 還是 靜態儲存區 中?比如 char pstr hello world 這裡,hello world 是乙個字串常量,pstr是在棧中的變數。我想問,字串常量,在哪個記憶體區域分配空間呢?好像應該不是在 棧區 分配空間吧!一 預備知識 程式的記憶體分配 乙...