程式記憶體及靜態變數

2021-09-07 23:22:40 字數 1375 閱讀 8191

參考:

1.棧區: 由編譯器自動分配釋放,像區域性變數,函式引數,都是在棧區。會隨著作用於退出而釋放空間。

3.堆區:程式設計師分配並釋放的區域,像malloc(c),new(c++) 

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

4.**區

1、隨著第一次函式的呼叫而初始化,卻不隨著函式的呼叫結束而銷毀

2、是在第一次呼叫進入的時候初始化,且只初始化一次,第二次呼叫函式,不會繼續初始化,而會直接跳過

使用全域性變數的話,變數就不屬於函式本身了,不僅受函式的控制,給程式的維護帶來不便。

(1)該變數在全域性資料區分配記憶體(區域性變數在棧區分配記憶體);

(2)靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化(區域性變數每次函式呼叫都會被初始化);

(3)靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0(區域性變數不會被初始化);

(4)它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,也就是不能在函式體外面使用它(區域性變數在棧區,在函式結束後立即釋放記憶體);

1、靜態全域性變數不能被其它檔案所用(全域性變數可以);

2、其它檔案中可以定義相同名字的變數,不會發生衝突(自然了,因為static隔離了檔案,其它檔案使用相同的名字的變數,也跟它沒關係了);

一般全域性變數可通過extern使用其他檔案的全域性變數; 對於靜態全域性變數,可使用include「檔案」的形式在其他檔案中呼叫;

1.靜態函式不能被其它檔案所用;

2.其它檔案中可以定義相同名字的函式,不會發生衝突;

用於修飾 class 的資料成員,即所謂「靜態成員」。這種資料成員的生存期大於 class 的物件(實體 instance)。靜態資料成員是每個 class 有乙份,普通資料成員是每個 instance 有乙份,因此靜態資料成員也叫做類變數,而普通資料成員也叫做例項變數。

對於非靜態資料成員,每個類物件(例項)都有自己的拷貝。而靜態資料成員被當作是類的成員,由該型別的所有物件共享訪問,對該類的多個物件來說,靜態資料成員只分配一次記憶體。

靜態資料成員儲存在全域性資料區。靜態資料成員定義時要分配空間,所以不能在類宣告中定義。

1.靜態成員之間可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式;

2.非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;

3.靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;

4.呼叫靜態成員函式,可以用成員訪問操作符(.)和(->)為乙個類的物件或指向類物件的指標呼叫靜態成員函式,也可以用類名::函式名呼叫(因為他本來就是屬於類的,用類名呼叫很正常)

靜態變數和非靜態變數

class string1 a和b編譯報錯,can not make a static referrence to no static filed s3,s4 分析 string s1 pingguo string s2 xiangjiao string s3 new string lizi str...

變數 靜態變數

變數 全域性變數 外部變數 在函式外部定義,以及被本程式所有物件或函式引用。區域性變數 內部變數 由某個函式或物件建立,只能被內部引用,而無法被其他物件或函式引用。特點 該變數在全域性資料區分配記憶體 未經初始化的靜態全域性變數會被程式自動初始化為0 在函式體內宣告的自動變數的值是隨機的,除非它被顯...

靜態變數,非靜態變數和final變數

package com.founder.bg.quartz.job 7 在程式執行時的區別 例項變數屬於某個物件的屬性,必須建立了例項物件,8 其中的例項變數才會被分配空間,才能使用這個例項變數。靜態變數不屬於某 9 個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,10 不用建...