以下內容來自《C++編程實戰寶典》
變量和函數占用的內存是系統在程序運行時為程序分配的,但並不是所有的變量和函數都被分配在同一塊內存區域中。對於一個C++程序來說,系統一般采用3種方式為程序分配內存,下面將分別介紹這3種方式。
(1)從靜態存儲區域分配
這部分內存在程序編譯的時候就已經分配好,並且這塊內存在程序的整個運行期間都存在。例如在函數外定義的全局變量,以及在創建時使用static修飾符的變量。在該區域存儲的內容一般是全局變量,其中存儲在數據段中的全局變量通常已經被初始化。
(2)在棧上進行內存分配
這部分區域被稱為堆棧,但這只是一種習慣性說法,並不是堆和棧的統稱。該部分存儲的變量一般是在函數體中定義的局部變量(不包括static聲明的變量,static意味着變量存放在數據段中),除此之外,經常在棧區出現的還有傳遞給函數的參數和函數的返回值等。棧區變量的生存周期是在入棧前(函數開始被調用)獲得內存空間,而在出棧時(函數結束調用)釋放內存空間。因此盡量不要將函數中的局部變量作為函數的返回值,因為在函數調用結束后,局部變量就不存在了,再使用此變量的值作為返回值,會使程序獲取的返回值有可能為隨機數。在執行函數時,函數體內的局部變量在棧上被自動創建,而在函數執行結束時,這些存儲單元自動被釋放。棧內存分配由操作系統完成而不需要程序員手動參與。因此其執行效率非常高。但是整個棧區可以被分配的內存容量有限。因此定義過多的未使用的局部變量會使程序執行變慢。
(3)從堆上分配
通常稱為動態分配的內存,該部分內存區域的大小並不固定,當程序運行時有程序員用 malloc() 函數等內存分配函數來分配,或使用 new 操作符等系統提供的函數來分配。該內存的大小可以根據程序中的實際需要來指定。該部分內存空間不會隨着函數運行的結束而被自動回收,也不會被自動釋放,需要程序員自己用 free() 函數或 delete 操作符進行內存的回收。動態內存的生存期由程序員自行決定,但如果分配了空間,就必須對其回收,否則運行的程序會出現內存泄漏,並且頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊,間接降低內存空間的使用率,嚴重時會產生大量內存碎片。
(內存碎片是一些分散的內存區域,大量內存碎片的存在會降低內存的使用率。)