C++淺析內(nèi)存分區(qū)模型概念與示例
初識C++內(nèi)存分區(qū)模型
在了解內(nèi)存分區(qū)之前,我們先來聊一聊為什么要進(jìn)行內(nèi)存分區(qū)。在進(jìn)行了內(nèi)存分區(qū)之后,在不同的區(qū)域存放的數(shù)據(jù),會有不同的生命周期,從而會讓程序員的編程變得更加靈活。
我們這次討論的內(nèi)存模型是將內(nèi)存劃分為四部分的版本,也是筆者在和黑馬學(xué)習(xí)過程中學(xué)習(xí)到的版本。
而C++在程序運行的過程中,將內(nèi)存分為四個區(qū)域:
- 代碼區(qū)
存放函數(shù)的二進(jìn)制代碼,即CPU執(zhí)行的機(jī)器指令,由操作系統(tǒng)進(jìn)行管理。
- 全局區(qū)
存放全局變量、靜態(tài)變量(static,分為全局與局部靜態(tài)變量)和部分常量。
- 棧區(qū)
由編譯器自動分配和釋放,存放函數(shù)的參數(shù)值、局部變量、局部常量等。
- 堆區(qū)
由程序員進(jìn)行分配和釋放,而如果程序員不釋放,則在程序結(jié)束運行時,由操作系統(tǒng)來進(jìn)行回收。
程序運行前
程序編譯后,會生成可執(zhí)行程序,而在該程序未執(zhí)行之前,內(nèi)存分為代碼區(qū)和全局區(qū)兩個區(qū)域。
代碼區(qū)
存放函數(shù)的二進(jìn)制代碼,即CPU執(zhí)行的機(jī)器指令,由操作系統(tǒng)進(jìn)行管理。
代碼區(qū)的特性是共享與只讀:
- 共享:對于被頻繁執(zhí)行的程序,在內(nèi)存中只需要保存一份代碼即可。
- 只讀:防止程序被意外修改。
全局區(qū)
存放全局變量、靜態(tài)變量(static)和部分常量。
其中部分常量為常量區(qū),即字符串常量和全局常量( const 關(guān)鍵字修飾的全局常量);不包括局部常量。
#程序運行后
棧區(qū)
由編譯器自動分配和釋放,存放函數(shù)的參數(shù)值、局部變量、局部常量等。
堆區(qū)
由程序員進(jìn)行分配和釋放,而如果程序員不釋放,則在程序結(jié)束運行時,由操作系統(tǒng)來進(jìn)行回收。
主要利用 new 在堆區(qū)開辟內(nèi)存,由 delete 進(jìn)行釋放。
ps:利用 new 常見的數(shù)據(jù),返回的是該數(shù)據(jù)對應(yīng)類型的指針。
內(nèi)存分區(qū)代碼示例
#include <iostream> using namespace std; //全局變量 全局區(qū) int global_a=10; int global_b=20; //全局常量 全局區(qū) const int global_const_a=10; const int global_const_b=20; //全局靜態(tài)變量 全局區(qū) static int static_global_a=10; static int static_global_b=20; //形參 棧區(qū) void func(int a){ //局部變量 棧區(qū) int b=20; cout<<"函數(shù)func()的形參 a 的地址為:"<< &a <<endl; cout<<"函數(shù)func()的局部變量 b 的地址為:"<< &b <<endl<<endl; } int main() { cout<<"棧區(qū)"<<endl; //局部變量 棧區(qū) int a = 10; int b = 20; cout<<"局部變量 a 的地址為:"<< &a <<endl; cout<<"局部變量 b 的地址為:"<< &b <<endl; //局部常量 棧區(qū) const int const_a=10; const int const_b=10; cout<<"局部常量 const_a 的地址為:"<< &const_a <<endl; cout<<"局部常量 const_b 的地址為:"<< &const_b <<endl; //形參 棧區(qū) func(a); cout<<"全局區(qū)"<<endl; cout<<"全局變量 global_a 的地址為:"<< &global_a <<endl; cout<<"全局變量 global_b 的地址為:"<< &global_b <<endl; cout<<"全局常量 global_const_a 的地址為:"<< &global_const_a <<endl; cout<<"全局常量 global_const_a 的地址為:"<< &global_const_b <<endl; cout<<"全局靜態(tài)變量 static_global_a 的地址為:"<< &static_global_a <<endl; cout<<"全局靜態(tài)變量 static_global_b 的地址為:"<< &static_global_b <<endl; //局部靜態(tài)變量 全局區(qū) static int Static_a=10; static int Static_b=20; cout<<"局部靜態(tài)變量 Static_a 的地址為:"<< &Static_a <<endl; cout<<"局部靜態(tài)變量 Static_b 的地址為:"<< &Static_b <<endl; //字符串常量 全局區(qū) cout<<"字符串常量的地址為:"<< &"hello world s1" <<endl; cout<<"字符串常量的地址為:"<< &"hello world s2" <<endl<<endl; cout<<"堆區(qū)"<<endl; //new 堆區(qū) int* new_a=new int(10); int* new_b=new int(20); cout<<"堆區(qū)變量 new_a 的地址為:"<< new_a <<endl; cout<<"堆區(qū)變量 new_a 的地址為:"<< new_b <<endl<<endl; return 0; }
運行結(jié)果分析如下:
到此這篇關(guān)于C++淺析內(nèi)存分區(qū)模型概念與示例的文章就介紹到這了,更多相關(guān)C++內(nèi)存分區(qū)模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ 動態(tài)內(nèi)存分配相關(guān)總結(jié)
這篇文章主要介紹了c++ 動態(tài)內(nèi)存分配相關(guān)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)和使用c++,感興趣的朋友可以了解下2021-02-02C語言大作業(yè)之圖書管理系統(tǒng)的實現(xiàn)詳程
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計算機(jī)應(yīng)用的普及,利用計算機(jī)對圖書館的日常工作進(jìn)行管理勢在必行,趁著寒假時間手把手帶你用C語言實現(xiàn)一個圖書管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2022-01-01C++中overload,override,overwrite的區(qū)別詳細(xì)解析
以下是對C++中overload,override,overwrite的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09C++隱式類型轉(zhuǎn)換運算符operator type()用法詳解
這篇文章主要介紹了C++隱式類型轉(zhuǎn)換運算符operator type()用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06