堆與棧

分區:

1,棧區(stack)由編譯器自動分配釋放,存放函數(方法)的參數值,局部變量的值,棧是有低地址向高地址擴展的數據結構,是一塊連續的內存的區域 。棧頂的地址和棧的最大容量是系統預先規定好的。

2,堆(heap)一般有程序員分配釋放,是由高地址向低地址擴展的數據結構,是不連續的內存區域(堆獲得的空間比較靈活)【堆和棧正好是從一段內存的兩端開始,向中間擠】

3,全局區:全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊,未初始化的在相鄰的另一塊區域,程序結束后由系統釋放

4,文字常量區:常量字符串存在此處。由系統釋放

5,程序代碼區:存放代碼的二進制代碼

注意:

1,碎片問題:由于堆是不連續的內存區間,如果頻繁的開辟/刪除,會造成內存空間的不連續,從而造成大量的碎片,導致程序效率降低。對于棧來說,總從先進后出,有次序的一一對應,不會導內存碎片。

2,內存分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有兩種分配方式,靜態和動態,靜態分配是由編譯器完成的,比如局部變量的分配,動態分配是由alloca函數進行分配,但是棧的動態分配也是由編譯器進行釋放,無需我們手工進行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容