C++程序設計的存儲設計思想

編程語言 數據結構 科技 小智雅匯 2017-04-17

程序中,在數據聲明中定義的變量和數組,它們存儲在靜態存儲區或者動態存儲區,其空間由系統負責分配,最終也由系統負責回收,分配時機和回收時機用戶無法控制。另外,它們都有自己的名字(因為定義時有命名),程序中可以通過變量名或數組名訪問它們。

而“動態分配”的變量或數組,分配時機和釋放時機可完全由程序員自己決定。另外,“動態分配”的空間,由於沒有數據分明,因此這部分空間沒有名字,無法像使用變量或數組那樣通過變更名或數組名引用其中的數據,只能通過指針變量來訪問。

對於數據在內存中的存儲,C語言提供了3種策略,即靜態分配、自動分配(棧式分配)和動態分配。

1 靜態分配:靜態分配由編譯器自動分配和釋放,在編譯時就確定了運行時變量在內存中的位置。這種性質允許變量在整個程序的運行過程中都不消失。在C語言中使用關鍵字static來定義靜態變量(可以是靜態局部變量、靜態全局變量或者在所有函數外面定義的全局變量)。

靜態存儲區是指存儲單元在程序運行的整個過程中一直分配給某些變量,這些變量一直“靜靜地”佔有這些單元,一直都不釋放,直到程序運行結束。

2 自動內存分配(在棧上分配):自動分配同樣也是由編譯器自動分配和釋放,在編譯時並不確定變量在內存中的位置,而是在調用函數時給變量分配空間,函數返回時釋放空間。C編譯器通過系統棧來管理這樣的變量。在C語言中,auto型變量是通過棧來管理的,不需要人為管理。

動態存儲區是指存儲單元在程序運行的不同時間可以分配不同的數據。需要時開闢單元,不需要時就釋放該單元。這樣某單元就可以在不同的時間分配給不同的變量,如函數裡auto類型的局部變量就是這樣,調用函數時,分配變量空間,退出函數時釋放該空間。再調用時,再開闢...

3 動態內存分配(在堆上分配):動態分配是指在程序運行過程中動態申請內存的方法。這樣的內存空間是從一個叫做堆的空間申請的,申請的空間是一段連續的內存空間。不需要該內存空間時,應該人為釋放它,否則會導致內存資源的浪費。

內存中有一塊稱為“堆”(heap)的存儲區,程序可以根據需要隨時用stdlib.h提供的malloc()等函數在堆中申請一部分空間來存儲數據,當不需要時又可以隨時用free()函數釋放。這種根據需要隨時開闢、隨時釋放的內存分配方式,稱為動態內存分配。

C語言中malloc()大體的實現是,從操作系統一次性地取得比較大的內存,然後將這些內存“零售”給應用程序。

堆區動態內存分配全局區靜態區棧區auto型變量(內存重複使用)
常量(只讀)


代碼區(只讀)


(內存分配中的堆和棧與數據結構的堆和棧有本質的區別。)

C語言的變量有兩種屬性:數據類型和存儲類型。存儲類型標識符有:auto,extern,static,register。用來說明變量在計算機中不同的存儲形態,包括存儲位置、作用域和生存期。

變量存儲類型作用域生存期
auto局部變量所定義函數內部所定義函數運行期間
全部變量所定義之處到本源文件結束程序運行的整個過程
static局部變量所定義函數內部程序運行的整個過程
全部變量所定義之處到本源文件結束,限於本文件程序運行的整個過程
register局部變量所定義函數內部所定義函數運行期間
extern全部變量所定義之處到本源文件結束程序運行的整個過程

函數調用時,主調函數的實參是準備好的具體數值,形參是函數調用時才開闢單元的變量。

在編寫程序時,要告訴計算機這些數據的存儲位置。變量的存儲類型的功能之一就是確定該變量是存放在動態數據區、靜態存放區還是寄存器中。

內存區存儲的內容

程序區程序代碼

靜態存儲區全局變量、靜態局部變量編譯階段初始化,且只賦值一次,對靜態局部變量多次調用時,每次在前一次的結果上進行。
動態存儲區(棧區)局部動態變量、形參在進入它們的函數或複合語句時才初始化,相當於賦值語句。每調用一次,就重新賦值一次。
動態分配區(棧區)動態數據程序運行時與用戶交互完成。


(數據還可以存放在寄存器中)

數據存儲涉及的內容:

要多少具體在哪裡給誰用何時給用多久
數據類型數據地址作用域內存分配生存期
字節數量變量名、指針作用的代碼範圍何時分配到何種內存區域從單元開闢到釋放

磁盤文件是指存儲在外部介質(硬盤、光盤或U盤)上的文件。 磁盤文件的輸入(外部存儲器上的磁盤文件→內存)、輸出(內存→外部存儲器上的磁盤文件)是外存與內存的數據交互。

C++程序設計的存儲設計思想

C++程序設計的存儲設計思想

相關推薦

推薦中...