堆和棧的區別:
1、管理方式不同;
2、空間大小不同;
3、能否產生碎片不同;
4、生長方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式: 棧:系統開闢,系統釋放
堆:手動開闢,手動釋放
空間大小:一般來講在32位系統下,堆記憶體可以達到2g的空間,棧空間大小是1m。
碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有乙個記憶體塊從棧中間彈出,在他彈出之前,在他上面的後進的棧內容已經被彈出
生長方向:堆:生長方向向上,也就是向著記憶體位址增加的方向;
棧:生長方向向下,是向著記憶體位址減小的方向增長。
分配方式:堆:都是動態分配的,沒有靜態分配的堆
棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。
分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。
堆則是c/c++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法在堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會分到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。
從這裡我們可以看到,堆和棧相比,由於大量new/delete的使用,容易造成大量的記憶體碎片;由於沒有專門的系統支援,效率很低;由於可能引發使用者態和核心態的切換,記憶體的申請,代價變得更加昂貴。所以棧在程式中是應用最廣泛的,就算是函式的呼叫也利用棧去完成,函式呼叫過程中的引數,返回位址,ebp和區域性變數都採用棧的方式存放。
區域性靜態變數:
該變數在全域性資料區分配記憶體
如果不顯示初始化,那麼將被隱式初始化為0
它始終駐留在全域性資料區,直到程式執行結束
其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。
static修飾成員變數:不屬於物件私有屬於物件共享,屬於類
修飾成員變數時:
(1)由於不屬於物件,即不由建構函式初始化,所以在類外初始化
(2)不依賴物件訪問
修飾成員方法時:
(1)無this指標(所以不能訪問普通成員變數只能訪問靜態成員變數),不像類中普通成員方法的this_cel的呼叫約定而是_cdecl的呼叫約定
(2)無法呼叫普通成員方法
(3)普通成員方法可以呼叫靜態成員方法 靜態成員方法不依賴物件呼叫
static在空類中 對類的大小沒有任何影響
static關鍵字與final關鍵字區別
static作用 1.修飾屬性 static關鍵字修飾的屬性為靜態屬性,與類相關,與類的例項無關,乙個類的不同例項共享乙個靜態屬性,訪問方式為類.屬性 2.修飾方法 被static修飾的方法稱為靜態方法,不能被重寫 3.修飾 塊 用於初始化靜態成員屬性 4.修飾類 修飾的類只能是內部類,普通類不能用...
static關鍵字和final關鍵字
static記住幾點 1.優先順序高,載入優先物件例項化 2.在記憶體中只分配一次 3.屬於類本身,所有例項共享,一處變,處處變 4.1 static不能訪問沒有static修飾的方法 因為不認識,物件例項後才能在外部使用方法 2 可以訪問static塊 3 未加static的方法可以訪問stati...
final關鍵字 和 static關鍵字
一.final關鍵字的作用 1.使用 final 方法的原因 第乙個原因是把方法鎖定,以防任何繼承類修改它的含義 第二個原因是final修飾的方法效率快。2.final final用於修飾類 成員變數和成員方法。final修飾類,類不能被繼承 final修飾成員方法,方法不能被重寫,但是子類可以用父...