詳解C/C++內存區(qū)域劃分(簡而易懂)
C語言在內存中一共分為如下幾個區(qū)域,分別是:
1. 內存棧區(qū): 存放局部變量名;
2. 內存堆區(qū): 存放new或者malloc出來的對象;
3. 常數(shù)區(qū): 存放局部變量或者全局變量的值;
4. 靜態(tài)區(qū): 用于存放全局變量或者靜態(tài)變量;
5. 代碼區(qū):二進制代碼。
知道如上一些內存分配機制,有助于我們理解指針的概念。
C/C++不提供垃圾回收機制,因此需要對堆中的數(shù)據(jù)進行及時銷毀,防止內存泄漏,使用free和delete銷毀new和malloc申請的堆內存,而棧內存是動態(tài)釋放。
C/C++內存區(qū)域劃分詳解
C/C++內存分布
C/C++中,內存主要分為、堆、棧、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。
棧:棧又叫堆棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變量的存儲區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等,是向下增長的。所謂向下生長的就是,先調用的棧幀的地址比后調用的地址大,棧一般大小有幾個M左右。
#include<iostream> using namespace std; void f2() { int b = 0; cout << "b:" << &b << endl; } void f1() { int a = 0; cout <<"a:" <<&a << endl; f2(); } int main() { f1(); return 0; }
堆:就是那些由new/malloc分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new/malloc就要對應一個delete/free,由程序員主動釋放。堆是可以上增長的.意思是先建立的堆的地址小于后建立的堆的地址。
#include<iostream> using namespace std; int main() { void* p1 = malloc(10); void* p2 = malloc(10); cout << p1 << endl; cout << p2 << endl; return 0; }
數(shù)據(jù)段:存儲全局數(shù)據(jù)和靜態(tài)數(shù)據(jù)。
代碼段:可執(zhí)行的代碼/只讀常量
知道了內存分布,下面就來做題吧,考驗知識的時候到了,看看會做幾題吧
是不是前幾題還得心應手,后面就有點懵了
棧和堆的區(qū)別:
棧:由編譯器自動分配并且釋放,一般存儲函數(shù)的參數(shù)局部變量等
堆:由程序員分配釋放,若程不釋放則系統(tǒng)釋放
1、申請內存方式
棧:由系統(tǒng)自動分配,如變量的聲明的同時會開辟空間,(int a; 開辟4個字節(jié)的空間)(靜態(tài)指定)
堆:由程序員申請,需要制定大?。▌討B(tài)分配)
2、系統(tǒng)響應的不同
棧:只要剩余空間大于申請內存,系統(tǒng)就會提供,否則會棧溢出
堆:便歷空閑地址鏈表,找到符合要求的,就刪除該地址分配給程序,內存的首地址記錄分配的大小,(方便delete)多余的內存回收
3、空間大小不同
棧:連續(xù)的,編譯時就確定的常數(shù)
堆:不連續(xù),他的上限決定于系統(tǒng)中有效的虛擬內存
4、執(zhí)行效率的不同
棧:由系統(tǒng)分配,速度快
堆:程序員分配,速度慢,容易產生內存碎片,不過用起來方便
到此這篇關于C/C++內存區(qū)域劃分詳解的文章就介紹到這了,更多相關C++內存劃分內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(25.每k個一組翻轉鏈表)
這篇文章主要介紹了C++實現(xiàn)LeetCode(25.每k個一組翻轉鏈表),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07C++11用兩個線程輪流打印整數(shù)的實現(xiàn)方法
這篇文章主要介紹了C++11用兩個線程輪流打印整數(shù)的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09char str[] 與 char *str的區(qū)別詳細解析
以下是對char str[]與char *str的區(qū)別進行了詳細的介紹,需要的朋友可以過來參考下2013-09-09