1. 程式人生 > >靜態記憶體與動態記憶體

靜態記憶體與動態記憶體

一、何謂靜態記憶體、動態記憶體
靜態記憶體分配好後,程式執行過程中一直存在不會被釋放,且一旦分配好,其記憶體大小就固定下來不能改變,在編譯和連結的階段就會分配好,不佔用CPU資源。
程式中的各種變數,在編譯時系統已經為其分配了所需的記憶體空間,當該變數在作用域內使用完畢時,系統會自動釋放所佔用的記憶體空間。變數的分配與釋放,都無須程式設計師自行考慮。

動態記憶體是程式執行過程中,根據程式的需要分配和釋放,其大小可變。

二、堆與棧
堆和棧都是動態分配的,區別有兩點:
1、棧是由編譯器分配與釋放,堆是程式通過呼叫malloc或new分配,呼叫free或delete釋放。
2、棧是線性結構,堆是連結串列結構。


三、使用場景
1、全域性變數和static修飾的靜態變數都存放在靜態記憶體區。
2、函式內部定義的區域性變數,儲存在棧上,函式退出時,其佔用記憶體被收回。
3、通過呼叫malloc或new得到的記憶體在堆上,不再需要時要顯示的呼叫free或delete來釋放,否則會造成記憶體洩漏,雖然有些作業系統會在程式退出後自動回收這部分記憶體,但還是要記住申請記憶體與釋放記憶體成對操作,養成好習慣。

四、區別
a) 靜態記憶體分配在編譯時完成,不佔用CPU資源; 動態記憶體分配在執行時,分配與釋放都佔用CPU資源。
b) 靜態記憶體在棧(stack)上分配; 動態記憶體在堆(heap)上分配。
c) 動態記憶體分配需要指標和引用型別支援,靜態不需要。
d) 靜態記憶體分配是按計劃分配,由編譯器負責; 動態記憶體分配是按需分配,由程式設計師負責。
 
下面一段程式碼列舉靜態記憶體和動態記憶體的各種情形:
//main.cpp
int a = 0;  //全域性初始化區 ,靜態記憶體
char *p1;  //全域性未初始化區 ,靜態記憶體
main()
{
int b;  //棧
char s[] = "abc";  //棧
char *p2; // 棧
char *p3 = "123456";  //"123456\0"在常量區,靜態記憶體,p3在棧上。
static int c =0; //全域性(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配 得來的10和20位元組的區域就在堆區。
strcpy(p1, "123456");  //"123456\0"放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}

原文地址:https://www.cnblogs.com/heart-flying/p/9456694.html

https://www.cnblogs.com/davidgu/p/3785722.html