C++中的記憶體分布

來源:互聯網
上載者:User

C++中,記憶體分為5個區:堆、棧、自由儲存區、全域/靜態儲存區和常量儲存區。
棧:是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放局部變數、函數參數等。
堆:是由new分配的記憶體塊,由程式員釋放(編譯器不管),一般一個new與一個delete對應,一個new[]與一個delete[]對應。如果程式員沒有釋放掉,資源將由作業系統在程式結束後自動回收。
自由儲存區:是由malloc等分配的記憶體塊,和堆十分相似,用free來釋放。
全域/靜態儲存區:全域變數和靜態變數被分配到同一塊記憶體中(在C語言中,全域變數又分為初始化的和未初始化的,C++中沒有這一區分)。
常量儲存區:這是一塊特殊儲存區,裡邊存放常量,不允許修改。
(注意:堆和自由儲存區其實不過是同一塊地區,new底層實現代碼中調用了malloc,new可以看成是malloc智能化的進階版本)

堆與棧的討論:
管理方式:
  堆中資源由程式員控制(容易產生memory leak)。
  棧資源由編譯器自動管理,無需手工控制。

系統響應:
  對於堆,應知道系統有一個記錄空閑記憶體位址的鏈表,當系統收到程式申請時,遍曆該鏈表,尋找第一個空間大於申請空間的堆結點,刪除空閑結點鏈表中的該結點,並將該結點空間分配給程式(大多數系統會在這塊記憶體空間首地址記錄本次分配的大小,這樣delete才能正確釋放本記憶體空間,另外系統會將多餘的部分重新放入空閑鏈表中)。
  對於棧,只要棧的剩餘空間大於所申請空間,系統為程式提供記憶體,否則報異常提示棧溢出。
空間大小:
  堆是不連續的記憶體地區(因為系統是用鏈表來儲存空閑記憶體位址,自然不是連續的),堆大小受限於電腦系統中有效虛擬記憶體(32bit系統理論上是4G),所以堆的空間比較靈活,比較大。
  棧是一塊連續的記憶體地區,大小是作業系統預定好的,windows下棧大小是2M(也有是1M,在編譯時間確定,VC中可設定)。
片段問題:
  對於堆,頻繁的new/delete會造成大量片段,使程式效率降低。
  對於棧,它是一個先進後出的隊列,進出一一對應,不會產生片段。
生長方向:
  堆向上,向高地址方向增長。
  棧向下,向低地址方向增長。
分配方式:
  堆都是動態分配(沒有靜態分配的堆)。
  棧有靜態分配和動態分配,靜態分配由編譯器完成(如局部變數分配),動態分配由alloca函數分配,但棧的動態分配的資源由編譯器進行釋放,無需程式員實現。

分配效率:
  堆由C/C++函數庫提供,機制很複雜。所以堆的效率比棧低很多。
  棧是極其系統提供的資料結構,電腦在底層對棧提供支援,分配專門寄存器存放棧地址,棧操作有專門指令。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.