1. 程式人生 > >zhoubl668的專欄:遠帆,夢之帆!

zhoubl668的專欄:遠帆,夢之帆!

堆和棧的區別在哪裡?哪些變數會在棧中分配空間,哪些變數會在堆中分配空間?      
  ---------------------------------------------------------------      
  1
申請方式         
  stack:          
 
由系統自動分配例如,宣告在函式中一個區域性變數     int     b;     系統自動在棧中為b開闢空間          
  heap:          
 
需要程式設計師自己申請,並指明大小,在cmalloc函式p1 = (char *)malloc(10);     //free     
 

C++中用new運算子           //delete
 
p2 = (char *)malloc(10);          
 
但是注意p1p2本身是在棧中的。          
     
  2
申請後系統的響應棧:只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位堆:首先應該知道作業系統有一個記錄空閒記憶體地址的連結串列,當系統收到程式的申請時,會遍歷該連結串列,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點連結串列中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首地址處記錄本次分配的大小,這樣,程式碼中的
delete語句才能正確的釋放本記憶體空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒連結串列中。          
     
  3
申請大小的限制棧:Windows,棧是向低地址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。堆:堆是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大
         
     
  4
申請效率的比較:棧由系統自動分配速度較快。但程式設計師是無法控制的。堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便.          
 
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配記憶體,他不是在堆,也不是在棧是直接在程序的地址空間中保留一快記憶體,雖然用起來最不方便。但是速度快,也最靈活。          
     
  5
堆和棧中的儲存內容棧:在函式呼叫時,第一個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語句)的地址,然後是函式的各個引數,在大多數的C編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的地址,也就是主函式中的下一條指令,程式由該點繼續執行。堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程式設計師安排。          
     
  6
存取效率的比較     
  char     s1[]     =     "aaaaaaaaaaaaaaa";          
  char     *s2     =     "bbbbbbbbbbbbbbbbb";          
  aaaaaaaaaaa
是在執行時刻賦值的;bbbbbbbbbbb是在編譯時就確定的;但是,在以後的存取中,在棧上的陣列比指標所指向的字串(例如堆)快。比如:堆和棧的區別可以用如下的比喻來看出:使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

  #include           
  
void     main()           
  
{           
  
char     a     =1;           
  
char     c[]     ="1234567890";           
  
char*p     ="1234567890";           
  a     
=     c[1];           
  a     
=     p[1];           
  
return;           
  }

相關推薦

zhoubl668專欄

堆和棧的區別在哪裡?哪些變數會在棧中分配空間,哪些變數會在堆中分配空間?         ---------------------------------------------------------------         1、申請方式            sta

一個六年程式設計師的歲月沉浮成長

開篇: 本人從事Java開發有六年了,因為我比較貪玩,上進心不那麼強。總是逼不得已為了高薪跳槽才去學習, 所以也沒混成什麼大牛, 但好在現在也已經成家立業, 小日子過的還算滋潤, 起碼頂得住一月近萬元的吃喝拉撒玩各種貸款信用卡 不為金錢過於發愁了。 我特別感謝當初CSDN上遇見的那位大神,

教程|百行Python程式碼訓練情感分類器機器

  情感分析是一種流行的文字分析技術,用來對文字中的主觀資訊進行自動識別和分類。它被廣泛用於量化觀點、情感等通常以非結構化方式記錄的資訊,而這些資訊也因此很難用其他方式量化。情感分析技術可被用於多種文字資源,例如調查報告、評論、社交媒體上的帖子等。   &n

【謂小一】至大之內大一至小之內小一

專欄達人 授予成功建立個人部落格專欄

Python進階全面解讀高階特性切片

導讀:切片系列文章連續寫了三篇,本文是對它們做的彙總。為什麼要把序列文章合併呢?在此說明一下,本文絕不是簡單地將它們做了合併,主要是修正了一些嚴重的錯誤(如自定義序列切片的部分),還對行文結構與章節銜接做了大量改動,如此一來,本文結構的完整性與內容的質量都得到了很好的保證。 眾所周知,我們可以通過索引值(或

TypeScript 2019 路線圖更效率更易用

   TypeScript 開發團隊剛剛釋出了 TypeScript 2019 上半年的發展路線圖。2019年1月至6月,開發團隊將重點關注以下目標: 覆蓋更多 JS 開發者 提高生產力 改善使用者體驗 提高社群參與度 完善基礎設施 不過,開發團隊也強調

A784586的專欄任何事都存在 Plan B

python爬取mm131圖片 python3 #!/usr/bin/python #encoding: utf-8 """ http://www.mm131.com """ import urllib.request import re import os import

ggplot2初次見面請多多關照

序 作為一枚統計專業的學僧,首先需要掌握的程式語言一定是R。雖然自己對R談不上精通,但卻有著不一樣的熱愛,尤其熱衷於使用R語言繪製各種各樣覺得十分酷炫的圖。每每磕完一個繪圖作品,彷彿過了一個愉快的寒暑假,充實而滿足。而在R語言中,談到繪圖,就不得不聊聊ggpl

韻胡國安築2019揚帆起航共築成長

綠之韻築夢2019:揚帆起航,共築成長 近日,2018綠之韻事業說明會於長沙盛大召開。綠之韻集團副董事長高宇先生,聯袂綠之韻集團陝西分公司高管,攜手現場7000餘名綠之韻人基於“出發 就現在”這一主題,共襄盛會,共話未來。 驚豔亮相 綠之韻產品解析 優質的產品,就是企業最好

4.非關系型數據庫(Nosql)mongodb普通索引唯一索引

log 索引 xpl sys watermark lang mon style gravity  一:普通索引 1創建一個新的數據庫 > use toto; switched to db toto

Java學習不走彎路就是捷徑

下載地址 下載 何事 系統 也有 包括 軟件公司 項目管理師 應用 1.如何學習程序設計? Java是一種平臺,也是一種程序設計語言,如何學好程序設計不僅僅適用於Java,對C++等其他程序設計語言也一樣管用。有編程高手認為,JAVA也好C也好沒什麽分別,拿來就用。為什麽他

Python基礎知識hello world註釋變量數據類型

我們 重要 一個 yield code oba () turn 編程語言   從接觸編程語言以來,在我腦海裏經常有三個問號: 這是什麽? 這個有什麽用? 這個怎麽用?   我覺得初學一個東西,把這三個問號都搞明白,那麽剩下的就是孰能生巧的過程了,在接下來的博客中,每個知

編寫一個程序求出200到300之間的數且滿足條件它們三個數字積為42三個數字之和為12

clas system print gpo 變量 輸出 滿足 定義 post //定義變量ge、shi、bai,用於存放個位、十位、百位上的數字 int number=0; //使用for循環 for(nu

《逐旅程Windows遊戲編程從零開始》學習筆記GDI框架

register 開發 操作 程序 turn use 繪制 cal 完整 1 //===========================================【程序說明】=================================== 2 //

Dream team: Stacking for combining classifiers組合分類器

由於 into it is appear nds lin eas 行操作 blank sklearn實戰-乳腺癌細胞數據挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&u

數據中臺專欄(五)數棧企業級一站式數據中臺PaaS

從數據 創建 現在 產品設計 left 引擎 采集 可能 方便 本文作者:江楓袋鼠雲CTO,花名江楓,本名寧海元。2007年加入淘寶,曾是雙十一大促技術指揮部成員,“去IOE”數據庫負責人。打造過千億級實時日誌平臺、手機淘寶日誌分析創始人、阿裏雲數加平臺技術創始人。正文:2

real山風全球獨家專欄區塊鏈?數字貨幣將顛覆未來的財富

出現 浪潮 競爭 免費 watermark 投資 還在 意義 希望 有一天你突然發現:市場不好做了?你的產品利潤太薄了?你的人才出現在競爭對手那了?你的企業陷入困境了.....請不要驚訝!!因為:這是一個跨界的時代!每一個行業都在整合。原來一直獲利的產品,在另外一個人手裏,

real山風全球獨家專欄擡起頭做事低下頭做人

它的 頭頂 遮掩 隨著 一場 風光無限 弱水三千 與他 天下 茫茫人海,熙熙攘攘。喧囂塵寰,人聲鼎沸。大千世界,萬象橫陳。紅塵環宇,琳琳朗朗。擡起頭,心胸開闊。低下頭,腳踏實地。白雲漂浮,了然我心。過眼煙雲,無擾我意。站的高,看人間萬像。低下頭,思自己得失。寄身於山水,處忘

阿裏雲朱照邊緣計算無處不在

服務 互聯 超過 每天 計算平臺 移動互 阿裏雲 距離 本質 摘要: 在2018杭州雲棲大會19號下午的論壇上,朱照遠對邊緣計算進行了深入的闡述,他認為邊緣計算是雲計算的一部分,是對雲計算邊界的拓展,雲和邊緣、終端協同,是萬物智聯時代的基本形態,這一組合,將滿足企業低成本低

【Twinkle】轉做碼農差不多十五年了聊聊程式設計師十五年內職業生涯規劃共勉

    很多人以為技術人員可以做一直做下去,但是最近我發現這個觀點不完全正確,因為能一直做下去的技術人員非常稀少,因為不同的年齡段,公司對技術人員的要求會不一樣,如最近傳言華為計劃裁掉40歲以上的程式設計師,首先我認為肯定不會裁掉所有40歲以上的技術人員,如CTO或高階技術專家不