堆(heap) 為程式儲存的一塊記憶體區域,用來儲存那些在執行時才知道其存在與大小的資料; 程式能夠從堆中分配記憶體給這些元素;在用完之後,應該釋放掉這些記憶體。 堆中所有的的東西都是匿名的----不能按名字直接訪問只能通過指標間接的訪問
棧(stack) 為程式儲存的一塊記憶體區域,用來儲存狀態資料, 例如:過程或函式的位址,引數,有時候還包括區域性變數。 所以,堆和棧的區別:乙個是動態,乙個是靜態; 堆是在程式執行時動態分配的,而棧的分配是編譯完後,就確定了; 棧記憶體的**,系統自動進行了,而堆上分配的記憶體,需要手工顯式**。 malloc , new分配的記憶體就是在堆上的,如果不用free, delete**, 就會造成記憶體洩漏(垃圾),不過,一般作業系統會在整個程式(程序)退出時, **分配給這個程序的記憶體等資源。
堆和棧的區別:
(1)作業系統方面區別:
在使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
(2)資料結構方面區別:
還有就是資料結構方面的堆和棧,這些都是不同的概念。這裡的堆實際上指的就是(滿足堆性質的)優先佇列的一種資料結構,第1個元素有最高的優先權;棧實際上就是滿足先進後出的性質的數學或資料結構。雖然堆疊,堆疊的說法是連起來叫,但是他們還是有很大區別的,連著叫只是由於歷史的原因。
記憶體那些事
linux中的free m可以檢視當前的記憶體使用情況 yejianfeng iz23fsd free m total used free shared buffers cached mem 7869 7737 132 0 489 4419 buffers cache 2828 5040 swap ...
C C 分配記憶體的那些事
首先需要知道,編譯器給變數分配的記憶體分為三部分 靜態儲存區域 棧 堆。靜態儲存區 主要儲存全域性變數和靜態變數。棧 呼叫函式相關的變數 位址等,底層對棧提供支援,棧的大小遠小於堆的大小,向負方向生長,限定大小。堆 儲存動態生成的變數,操作由c c 函式庫提供,效率低於棧,向正方向生長,無限大小 3...
c 記憶體對齊那些事
一.記憶體對齊介紹 目前的計算機系統中 cpu都是按照位元組進行讀取儲存的記憶體資料,訪問某乙個變數的時候 需要在特定的位址空間中訪問,此時就需要各種不同型別的變數在記憶體空間中按照一定的規則進行排放,而不是乙個接乙個的進行有序排放。所以現代編譯器中都會對記憶體進行自動的對齊。struct stru...