一般來說,寫程序就是與數據打交道,在執行程序某一功能的時候,將該功能所需要的數據加載到內存中,然后在執行完畢的時候釋放掉該內存。
數據在內存中的存放方式有以下幾種:
(1)棧區——由編譯器自動分配并且釋放,該區域一般存放函數的參數值、局部變量的值等。
(2)堆區——由程序員分配釋放。
(3)寄存器區——用來保存棧頂指針和指令指針。
(4)全局區(靜態區)——全局變量和靜態變量的存儲是放在一塊的。
(5)文字常量區——放常量字符串的區域。
(6)程序代碼區——存放函數體的二進制代碼。
棧和堆的區別:
(1)內存申請方式上的不同
<1>棧:由系統自動分配。
<2>堆:由程序員自己申請,需要指明變量的大小。
(2)系統響應的不同
<1>棧:只要棧的剩余空間大于所申請空間,系統就為程序提供 內存,否則提示棧溢出。
<2>堆:系統收到程序申請空間的要求后,會遍歷一個操作系統,用于記錄內存空閑地址的鏈表,當找到一個空間大于所申請空間的堆結點后,就會就會將該結點從記錄內存空閑地址的鏈表中刪除。并將該結點的內存分配給程序,然后在這塊內存區域的首地址處記錄分配的大小,這樣在使用delete來釋放內存的時候,delete才能正確的識別并刪除該內存區域的所有變量。另外,申請的內存空間與堆結點上的內存空間不一定相等,這時系統就會自動將堆結點上多出來的那一部分內存空間回收到空閑鏈表中。
(3)空間大小的不同
<1>棧:在Windows下,棧是一塊連續的內存的區域,其大小數值是編譯時就確定的常數,是由系統預先根據棧頂的地址和棧的最大容量定義好的。如果你的數據申請的內存空間超過棧的空間,那么系統會提示棧溢出。因此,別指望棧能存儲比較大的數據。
<2>堆:堆是不連續的內存區域。各塊區域由鏈表將它們串聯起來。堆的上限是由系統中有效的虛擬內存來定的。因此獲得的空間比較大,而且獲得空間的方式也比較靈活。
(4)執行效率的不同
<1>棧:棧由系統自動分配,因此速度較快。
<2>堆:堆是由程序員分配的內存,速度一般比較慢,而且容易產生內存碎片。
(5)執行函數時的不同
<1>棧:在函數調用時,第一個進棧的是被調用函數下一行的內存地址;其次是函數的參數,假如參數多于一個,那么次序是從右往左;最后才是函數的局部變量。由于棧的先進后出原則,因此它永遠不可能產生內存碎片。
<2>堆:堆是一大堆不連續的內存區域,在系統中由鏈表串接起來。堆的運行效率比棧要低得多,而且也容易產生碎片。優點是堆可以存儲相當多的數據,并且一些細節可以由程序員安排。
-
二進制
+關注
關注
2文章
796瀏覽量
41757 -
C++
+關注
關注
22文章
2114瀏覽量
73854 -
編譯器
+關注
關注
1文章
1642瀏覽量
49283
原文標題:【博文連載】C++中的“棧與堆”
文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論