對於應用程序而言,內存中存儲區域大致有堆、棧、靜態區域三個部分。系統在分配內存的時候,會在內存中尋找一個能夠滿足申請大小的區域進行標記,並返回此區域的大小。
在應用程序運行時,系統爲應用程序分配的只是虛擬的地址空間,並不是實際的物理存儲器。這就需要給進程預定的區域(地址空間)調撥物理存儲器(內存),來存放相關的數據。但是通過CPU來進行操作,也可以將磁盤早上的頁交換文件作爲內存的一部分。通過頁交換文件使得內存增加,但是同時將消耗大量CPU資源。
如果多個進程共享一個內存映射文件,在修改文件內容時,系統會產生一個新視圖,來複制當前文件中的內容,也就是說,修改的其實是複製視圖的內容,修改完畢後,系統將新視圖的內容更新到源文件中,此時所有共享此內存的進程全部會看到修改的內容。
堆:對於應用程序而言,是一塊由系統爲應用程序而分配的內存區域。一個進程默認的有一個默認堆區域,程序中所有的內存申請,全部來自此區域。如:new/malloc申請的內存。在進程結束後,默認堆空間釋放。應用程序對堆的訪問原則上是順序的,如3個線程同時訪問堆,必須進行排隊。程序猿也可以不使用進程默認的堆,進行自己創建一個堆。將 new操作符重載即可使用自己創建的堆空間。但是delete操作符也必須重載。
棧:一個進程中,默認的也會有一個棧區域,但是棧是由系統編譯器進行分配和銷燬。棧的存在是因爲進程中的主線程,在線程中(程序中)聲明的局部變量全部都在棧上。進程中的每一個線程都對應有一個線程棧,進行存儲線程中的局部變量。由系統進行回收。
靜態區域:程序中所有的靜態或者全局變量都存儲在此區域,在進程結束後,由系統進行回收。
順便提一下new和malloc.個人覺得要說兩者區別無非兩點:
1、 new是操作符,在申請內存的時候,編譯器會調用構造函數自動對申請的區域進行初始化。Malloc是個函數,只會申請內存不會進行初始化。
2、 new申請的時候,必須指定類型,成功後會返回指定類型的指針。指針指向分配的內存地址。Malloc 申請的時候,如果不強制指定類型,返回一個void *的指針。也就是說申請的內存區域可以存放任何類型的數據。
兩者都是在堆上進行申請。New申請的對象在釋放後,應該講此對象的指針指向NULL,而不是不處理。
memory
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
libxml2剖析(2):編譯
我还在迷路
2018-08-27 20:04:11
libxml2 主要函數用法
我还在迷路
2018-08-27 20:04:11
windows 編譯libxml2 64位及32位都可以使用
我还在迷路
2018-08-27 20:04:11
socket編程 及select poll epoll示例
我还在迷路
2018-08-27 20:04:09
libxml2剖析(3):使用教程
我还在迷路
2018-08-27 20:04:09
const的思考
duchuanying
2018-08-27 19:55:25
深入理解C語言指針的奧祕
duchuanying
2018-08-27 19:55:25
C/C++ 程序設計員應聘常見面試試題深入剖析
duchuanying
2018-08-27 19:55:24
內核模式下獲取SSDT服務索引代碼
毛主席夸帅
2018-08-27 19:54:14
獲取Windows系統版本號以及位數(兼容Win8)
毛主席夸帅
2018-08-27 19:54:13
[Win32]獲取當前系統可用磁盤空間最大的盤符
毛主席夸帅
2018-08-27 19:54:02
在物理內存不足的情況下使用內存映射文件進行大內存操作
毛主席夸帅
2018-08-27 19:54:01
DirectDraw方式截取系統屏幕
毛主席夸帅
2018-08-27 19:53:51
GDI方式截取系統屏幕
毛主席夸帅
2018-08-27 19:53:50
24小時熱門文章
-
釘釘打卡速度慢
-
Nginx R31 doc 官方文檔-01-nginx 如何安裝
-
Python 潮流週刊#51:用 Python 繪製美觀的圖表
-
Qt/C++音視頻開發74-合併標籤圖形/生成yolo運算結果圖形/文字和圖形合併成一個/水印濾鏡
-
挑戰程序設計競賽 2.2章習題 POJ - 3617 Best Cow Line 貪心
-
字節面試:MySQL什麼時候 鎖表?如何防止鎖表?
-
.NET8連接SQL SERVER 2008 R2 報:證書鏈是由不受信任的頒發機構頒發的
-
golang開發環境搭建(win10)
-
python計算機視覺學習筆記——PIL庫的用法
-
Golang初學:獲取程序內存使用情況,std runtime