變數的儲存區

2021-06-02 11:25:17 字數 1815 閱讀 5344

一.在c中分為這幾個儲存區

1.棧   -   有編譯器自動分配釋放

2.堆   -   一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**

3.全域性區(靜態區),全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的》 另一塊區域。-   程式結束釋放

4.另外還有乙個專門放常量的地方。   -   程式結束釋放

二.在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。

1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

2.堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程》 序結束後,作業系統會自動**。

3.自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

4.全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。

5.常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改)

所以靜態變數和全域性變數放在全域性/靜態儲存區,而常量存放在常量儲存區,程式**當然放在**區了~~

變數的類別:

根據作用域可分為全域性變數和區域性變數。

根據生存週期可分為靜態儲存方式和動態儲存方式,具體地又分為自動的(auto)、靜態的(static)、暫存器的(register)、外部的(extern)。

靜態儲存方式是指在程式執行期間分配固定的儲存空間的方式,動態儲存方式是在程式執行期間根據需要進行動態的分配儲存空間的方式。

每乙個變數均有作用域和儲存類別兩個屬性,這些屬性共同用於描述乙個變數,這些不同型別的變數與儲存位置的關係如下:

外部變數(全域性變數)、靜態外部變數、靜態區域性變數儲存在靜態儲存區。

自動區域性變數(區域性變數預設為自動區域性變數)、函式形參保存在動態儲存區,不論是靜態儲存區還是動態儲存區均屬於記憶體中的使用者區。

但是,暫存器變數是儲存在cpu暫存器中的而不是記憶體中。

區域性變數:在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的,這種型別的變數就稱為「區域性變數」。

全域性變數:在函式外定義的變數,可以為本原始檔中其它函式所公用,有效範圍為從定義變數的位置開始到本原始檔結束,這種型別的變數就稱為「全域性變數」。

atuo:在宣告區域性變數時,若不指定 static,預設均是 auto,這類變數都是動態分配儲存空間的,資料儲存在動態儲存區中。

static:在宣告區域性變數時,使用關鍵字 static 將區域性變數指定為「靜態區域性變數」,這樣在函式呼叫結束後不消失而保留原值,即占用的儲存單元不釋放,在下一次函式呼叫時,該變數已有值就是上次函式呼叫結束時的值。

register:在宣告動態區域性變數或者函式形參時,可將變數宣告為register,這樣編譯系統就會為變數分配乙個暫存器而不是記憶體空間,通過這種方式可提公升對某些區域性變數頻繁呼叫的程式的效能。(暫存器運算速度遠高於記憶體)

extern:用於擴充套件全域性變數的作用域,比如如果函式想引用乙個外部變數,但該外部變數在該函式後定義,那麼這個函式需要使用 extern 來宣告變數,這樣才能使用在該函式後面定義的全域性變數。此外,extern 還可以在多檔案的程式中宣告外部變數。

由於變數從不同維度劃分,形成了多種錯綜複雜的關係,在學習程式設計的時候需要重點關注。

方法區(Method Area)儲存的靜態變數

靜態變數又稱為類變數,類中被static修飾的成員變數都是靜態變數 類變數 靜態變數之所以又稱為類變數,是因為靜態變數和類關聯在一起,隨著類的載入而存在於方法區 而不是堆中 八種基本資料型別 byte short int long float double char boolean 的靜態變數會在方...

const變數的儲存區及修改許可權

const變數的儲存區及修改許可權 cpp view plain copy const inta 1 int p const cast int a p 2 cout value a a endl cout value p p endl cout address a a endl cout addre...

靜態變數儲存在哪個區

美團2017校園招聘 android 靜態變數儲存在 區 a 全域性區 b 堆 c 棧 d 常量區 知識點 記憶體到底分幾個區?1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意...