memory

對於應用程序而言,內存中存儲區域大致有堆、棧、靜態區域三個部分。系統在分配內存的時候,會在內存中尋找一個能夠滿足申請大小的區域進行標記,並返回此區域的大小。


在應用程序運行時,系統爲應用程序分配的只是虛擬的地址空間,並不是實際的物理存儲器。這就需要給進程預定的區域(地址空間)調撥物理存儲器(內存),來存放相關的數據。但是通過CPU來進行操作,也可以將磁盤早上的頁交換文件作爲內存的一部分。通過頁交換文件使得內存增加,但是同時將消耗大量CPU資源。


如果多個進程共享一個內存映射文件,在修改文件內容時,系統會產生一個新視圖,來複制當前文件中的內容,也就是說,修改的其實是複製視圖的內容,修改完畢後,系統將新視圖的內容更新到源文件中,此時所有共享此內存的進程全部會看到修改的內容。


 


堆:對於應用程序而言,是一塊由系統爲應用程序而分配的內存區域。一個進程默認的有一個默認堆區域,程序中所有的內存申請,全部來自此區域。如:new/malloc申請的內存。在進程結束後,默認堆空間釋放。應用程序對堆的訪問原則上是順序的,如3個線程同時訪問堆,必須進行排隊。程序猿也可以不使用進程默認的堆,進行自己創建一個堆。將 new操作符重載即可使用自己創建的堆空間。但是delete操作符也必須重載。


 


棧:一個進程中,默認的也會有一個棧區域,但是棧是由系統編譯器進行分配和銷燬。棧的存在是因爲進程中的主線程,在線程中(程序中)聲明的局部變量全部都在棧上。進程中的每一個線程都對應有一個線程棧,進行存儲線程中的局部變量。由系統進行回收。


 


靜態區域:程序中所有的靜態或者全局變量都存儲在此區域,在進程結束後,由系統進行回收。


 


順便提一下new和malloc.個人覺得要說兩者區別無非兩點:


1、  new是操作符,在申請內存的時候,編譯器會調用構造函數自動對申請的區域進行初始化。Malloc是個函數,只會申請內存不會進行初始化。


2、  new申請的時候,必須指定類型,成功後會返回指定類型的指針。指針指向分配的內存地址。Malloc 申請的時候,如果不強制指定類型,返回一個void *的指針。也就是說申請的內存區域可以存放任何類型的數據。


兩者都是在堆上進行申請。New申請的對象在釋放後,應該講此對象的指針指向NULL,而不是不處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章