静态分配和动态分配内存的区别
要弄懂這個問題,首先你得知道靜態和動態指的是什么。個人覺得卡耐基上的解釋很經典:
???? “The word?static?refers to things that happen at compile time and link time when the program is constructed—as opposed to load time or run time when the program is actually started.”
???? “The term?dynamic?refers to things that take place when a program is loaded and executed. ”
????? 說白了,內存的靜態分配和動態分配的區別主要是兩個:
??????? 一是時間不同。靜態分配發生在程序編譯和連接的時候。動態分配則發生在程序調入和執行的時候。
????? 二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由函數malloc進行分配。不過棧的動態分配和堆不同,他的動態分配是由編譯器進行釋放,無需我們手工實現。????
???????對于一個進程的內存空間而言,可以在邏輯上分成3個部份:代碼區,靜態數據區和動態數據區。動態數據區一般就是“堆棧”。“棧(stack)”和“堆(heap)”是兩種不同的動態數據區,棧是一種線性結構,堆是一種鏈式結構。進程的每個線程都有私有的“棧”,所以每個線程雖然代碼一樣,但本地變量的數據都是互不干擾。一個堆棧可以通過“基地址”和“棧頂”地址來描述。全局變量和靜態變量分配在靜態數據區,本地變量分配在動態數據區,即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量。
??????? 一般,用static修飾的變量,全局變量位于靜態數據區。函數調用過程中的參數,返回地址,EBP和局部變量都采用棧的方式存放。
?
?
其它:
所謂動態內存分配就是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不象數組等靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配,且分配的大小就是程序要求的大小。
例如我們定義一個float型數組:float score[100];
但是,在使用數組的時候,總有一個問題困擾著我們:數組應該有多大?在很多的情況下,你并不能確定要使用多大的數組,比如上例,你可能并不知道我們要定義的這個數組到底有多大,那么你就要把數組定義得足夠大。這樣,你的程序在運行時就申請了固定大小的你認為足夠大的內存空間。即使你知道你想利用的空間大小,但是如果因為某種特殊原因空間利用的大小有增加或者減少,你又必須重新去修改程序,擴大數組的存儲范圍。這種分配固定大小的內存分配方法稱之為靜態內存分配。但是這種內存分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數情況下會浪費大量的內存空間,在少數情況下,當你定義的數組不夠大時,可能引起下標越界錯誤,甚至導致嚴重后果。
我們用動態內存分配就可以解決上面的問題. 所謂動態內存分配就是指在程序執行的過程中動態地分配或者回收存儲空間的分配內存的方法。動態內存分配不象數組等靜態內存分配方法那樣需要預先分配存儲空間,而是由系統根據程序的需要即時分配,且分配的大小就是程序要求的大小。從以上動、靜態內存分配比較可以知道動態內存分配相對于景泰內存分配的特點:
1、不需要預先分配存儲空間;
2、分配的空間可以根據程序的需要擴大或縮小。
要實現根據程序的需要動態分配存儲空間,就必須用到malloc函數.
malloc函數的原型為:void *malloc (unsigned int size) 其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否為NULL并執行相應的操作。
?
原文地址:http://hi.baidu.com/wu_yuzhi/blog/item/8bafc18a4922c2759f2fb4cb.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的静态分配和动态分配内存的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: malloc 源码
- 下一篇: 堆/栈/动态存储方式/静态存储方式