詳解C/C++內存區域劃分(簡而易懂)

C語言在內存中一共分為如下幾個區域,分別是:

1. 內存棧區: 存放局部變量名;
2. 內存堆區: 存放new或者malloc出來的對象;
3. 常數區: 存放局部變量或者全局變量的值;
4. 靜態區: 用於存放全局變量或者靜態變量;
5. 代碼區:二進制代碼。
知道如上一些內存分配機制,有助於我們理解指針的概念。

C/C++不提供垃圾回收機制,因此需要對堆中的數據進行及時銷毀,防止內存泄漏,使用free和delete銷毀new和malloc申請的堆內存,而棧內存是動態釋放。

C/C++內存區域劃分詳解

C/C++內存分佈

在這裡插入圖片描述

C/C++中,內存主要分為、堆、棧、全局/靜態存儲區和常量存儲區。

棧:棧又叫堆棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變量的存儲區。裡面的變量通常是局部變量、函數參數等,是向下增長的。所謂向下生長的就是,先調用的棧幀的地址比後調用的地址大,棧一般大小有幾個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;
}

在這裡插入圖片描述

數據段:存儲全局數據和靜態數據。
代碼段:可執行的代碼/隻讀常量

知道瞭內存分佈,下面就來做題吧,考驗知識的時候到瞭,看看會做幾題吧

在這裡插入圖片描述

是不是前幾題還得心應手,後面就有點懵瞭

在這裡插入圖片描述
在這裡插入圖片描述

棧和堆的區別:

棧:由編譯器自動分配並且釋放,一般存儲函數的參數局部變量等
堆:由程序員分配釋放,若程不釋放則系統釋放

1、申請內存方式
棧:由系統自動分配,如變量的聲明的同時會開辟空間,(int a; 開辟4個字節的空間)(靜態指定)

堆:由程序員申請,需要制定大小(動態分配)
2、系統響應的不同

棧:隻要剩餘空間大於申請內存,系統就會提供,否則會棧溢出

堆:便歷空閑地址鏈表,找到符合要求的,就刪除該地址分配給程序,內存的首地址記錄分配的大小,(方便delete)多餘的內存回收

3、空間大小不同
棧:連續的,編譯時就確定的常數
堆:不連續,他的上限決定於系統中有效的虛擬內存
4、執行效率的不同
棧:由系統分配,速度快
堆:程序員分配,速度慢,容易產生內存碎片,不過用起來方便

到此這篇關於C/C++內存區域劃分詳解的文章就介紹到這瞭,更多相關C++內存劃分內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: