本篇前言
hello,又和大家見面了!這次我帶來的學習分享是:明解c/c++程式的記憶體模式–記憶體四區,首先說明一哈,“明解”不是要內記憶體四區講的特別深入,而是給大家講明白記憶體四區是個什么東西,它的基礎知識,讓大家在平時學習中遇見它不會特別茫然,學習記憶體四區還對語言的學習有特別大的幫助(本人親身經歷,以前不明白“這個代碼必須這樣寫,那個不能那樣寫”這樣的規定,現在突然就懂了,原來和記憶體四區有關系啊!),相信大家看完這篇博客也會有這樣的感受,
本篇目錄
1.記憶體磁區模型
2.代碼區
3.全域區
4.堆疊區
5.堆區
6.小編總結
1. 記憶體磁區模型
c/c++程式在執行時,將記憶體大致分為四個區域
- 代碼區: 存放函式體的二進制代碼,由操作進行管理
- 全域區: 存放全域變數和靜態變數以及常量
- 堆疊區:由編譯器自動分配和釋放,存放函式的引數值
- 堆區:由程式員分配和釋放,若程式員不釋放,程式結束時由作業系統回收
記憶體四區的意義
不同區域存放的資料賦予不同的生命周期,給我們更大的靈活編程
這里和大家簡單的說了一下記憶體分布模型,下面讓我們具體看看它們分別有什么作用吧
2.代碼區
存放CPU執行的機器指令
代碼區是共享的,共享的目的是對于頻繁被執行的程式,只需要在記憶體中有一份代碼就行
代碼區是只讀的,使其只讀的原因是防止程式意外的修改它的指令
3.全域區
全域變數和靜態變數存放在這里
全域區還包括常量區,字串常量和其他常量也存放在這里
該區域的資料在程式結束后由作業系統釋放
為了讓大家更好的認識到在全域區里面的資料和不在全域區里面的資料分別有什么特點,我用一段代碼圖片給大家展示,相信大家看了后就一目了然了,

(為了方便觀察,地址都用int強轉了一下)可以清晰的看出有些資料的地址開頭是一模一樣的,那么它們就被存放在了同一塊區域,有些開頭是不一樣的,它們被存放在了不同的區域,比如全域變數,靜態變數,字串常量,const修飾的全域常變數它們都是存放在全域區里面的,而區域變數,const修飾的區域變數,它們是存放其他區域的,
為了方便大家記憶那些資料在全域區中,給大家畫了張圖,做了一下整理對比
4.堆疊區
由編譯器自動分配釋放,存放函式的引數值,區域變數等
注意事項:不要回傳區域變數的地址,堆疊區開辟的地址由編譯器自動釋放
為什么說不要回傳區域變數的地址呢?下面就讓我再用一段代碼圖告訴大家

大家會發現,同樣的代碼輸出兩遍,為什么輸出的值會不一樣?好奇怪?
其實在函式結束的時候,資料a就被釋放了,再用解參考運算子*去操作那塊記憶體,那塊記憶體已經不屬于你了,所以會輸出亂碼,可是第一次明明輸出的是10呀,其實這是VS編譯器做的一個保留,怕你手誤洗掉了某個資料,他就做了一次保留,所以第一次輸出的是10,
5.堆區
由程式員分配釋放,若程式員不釋放,程式結束時由作業系統回收
在c語言中用malloc在堆區開辟記憶體,c++中用new
下面用new進行講解
老樣子,先上一張代碼圖

這里要額外用一張圖說明一下,指標在本質上是區域變數,放在堆疊上,指標保存的資料是放在堆區
再回到圖一,你會發現現在重復輸出都能得到10,這是為什么呢,因為10這個資料存放在堆區,只要你不去把他釋放或者結束程式,它一直都在,是不是很神奇,哈哈哈,
小編總結
這次的博客到這里就結束了,關于四大區的內容,講的很淺,但是在初學階段了解這些知識就夠用了,我希望這次的分享可以幫到大家,如果大家發現博客中出現錯誤,歡迎在評論區中指出,我們下次再見!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275427.html
標籤:其他
上一篇:“過早的性能優化是魔鬼”
下一篇:給 21 歲的自己 6 點建議
