内存四区
每一個(gè)應(yīng)用程序,都有自己的內(nèi)存空間。例如程序1有程序1的內(nèi)存空間,程序2有程序2的內(nèi)存空間,程序1不能訪問程序2的內(nèi)存空間,程序2也不能訪問程序1的內(nèi)存空間。假設(shè)錢包是內(nèi)存,錢包里面的錢是內(nèi)存中的數(shù)據(jù)。你不能用別人的錢,因?yàn)閯e人的錢不是你的錢,反過來別人也不能用你的錢,因?yàn)槟愕腻X是你個(gè)人私有的;而你的錢又分為十元錢,二十元錢,五十元錢,一百元錢,不同面值的錢放在錢包不同的夾層里面,十元錢放在十元錢夾層里面,二十元錢放在二十元夾層里,五十元錢放在五十元夾層里,一百元錢放在一百元夾層里;如果你不加以區(qū)分,所有的錢都放在一個(gè)夾層里面,是不是很亂呢,我需要五十塊錢買東西,直接在五十元夾層里拿就好了,比起將整個(gè)錢包翻一遍要快速方便的多。內(nèi)存也是一樣的道理。錢包有四個(gè)夾層,而內(nèi)存也有四個(gè)區(qū),不同的區(qū)存放不同的數(shù)據(jù)。
棧區(qū):
棧(stack),是一種先進(jìn)后出的內(nèi)存結(jié)構(gòu),所有的局部變量、函數(shù)的形參都是放入棧中,當(dāng)一個(gè)局部變量超出其作用域時(shí),自動(dòng)從棧中彈出。
棧區(qū)存放的是局部變量。
存放在棧區(qū)的數(shù)據(jù),可以在程序運(yùn)行期間隨時(shí)修改。
對與局部變量,什么時(shí)候入棧,什么時(shí)候出棧,是不需要程序控制的,由編譯器控制。而堆則相反。
堆區(qū):
堆(heap)和棧一樣,也是一種在程序運(yùn)行期間隨時(shí)可以修改的內(nèi)存區(qū)域,但沒有棧那樣先進(jìn)后出的順序。
堆是一個(gè)大容器,它的容量要遠(yuǎn)遠(yuǎn)大于棧,但是在C/C++中,堆內(nèi)存空間需要手動(dòng)的分配及釋放(C語言通過malloc函數(shù)分配堆內(nèi)存,通過free函數(shù)釋放。C++語言通過new關(guān)鍵字分配堆內(nèi)存,通過delete關(guān)鍵字釋放)。
?
靜態(tài)區(qū):
靜態(tài)區(qū)存放的是:全局變量、全局靜態(tài)變量、局部靜態(tài)變量。
代碼區(qū)(code):
程序被操作系統(tǒng)加載到內(nèi)存的時(shí)候,所有的可執(zhí)行代碼都加載到代碼區(qū),也叫代碼段,這塊內(nèi)存是不能在程序運(yùn)行期間修改的。
代碼區(qū)存放的是程序的所有可執(zhí)行代碼。
void main() {int i;i = 0;cout << ++i << endl; }int i; 這句話不是可執(zhí)行代碼,所以不會(huì)放入代碼區(qū)。而是放入棧區(qū),因?yàn)閕是定義一個(gè)局部變量。
除了int i; 這句代碼意外,所有的代碼都將放入代碼區(qū)。
看一段代碼:
1 #include <iostream> 2 using namespace std; 3 4 int c; 5 void OutPut(const int *p1, const int *p2) 6 { 7 cout << hex << p1 << "\t" << p2 << endl; 8 } 9 int main() 10 { 11 int a; 12 int b; 13 static int d; 14 int *p1 = new int; 15 char *p2 = new char; 16 17 OutPut(&a, &b); 18 OutPut(&c, &d); 19 cout << "p1 = " << p1 << "\tp2 = " << hex << (int)p2 << endl; 20 cout << "main = " << main << "\tOutPut = " << OutPut << endl; 21 22 delete p1; 23 delete p2; 24 25 getchar(); 26 return 0; 27 }假設(shè):
a的地址 = 0016F738 b的地址 = 0016F72C
c的地址 = 01235510 d的地址 = 01235518
p1的地址 = 005CA0B0 ?p2的地址 = 005CA010
main的地址 = 0122150F OutPut = 0122125D
請問,變量a、b、c、d、p1、p2、p1指向的內(nèi)存、p2指向的內(nèi)存、main函數(shù)、OutPut函數(shù)都在區(qū)?
?
?
?
?
?
答:變量a、b在棧區(qū)
c,d在靜態(tài)區(qū)
p1,p2在棧區(qū)
p1指向的內(nèi)存、p2指向的內(nèi)存在堆區(qū)
main函數(shù)、OutPut函數(shù)在代碼區(qū)
?
轉(zhuǎn)載于:https://www.cnblogs.com/LandyTan/p/6400549.html
總結(jié)
- 上一篇: BZOJ 1662: [Usaco200
- 下一篇: java面向对象之父类的引用指向子类的对