亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

棧區和堆區內存分配的區別介紹

2020-02-24 14:25:03
字體:
來源:轉載
供稿:網友

一直以來很多小伙伴們對于棧區和堆區內存分配的區別都不是很了解,在c語言中我們總會聽到內存一會在棧上分配,一會又在堆上分,那么它們具體有什么區別呢?下面我們就去看看棧區和堆區內存分配的區別介紹。

?

從上圖可知,程序占用的內存被分了以下幾部分.

?

1、棧區(stack)
由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等,內存的分配是連續的,類似于平時我們所說的棧,如果還不清楚,那么就把它想成數組,它的內存分配是連續分配的,即,所分配的內存是在一塊連續的內存區域內.當我們聲明變量時,那么編譯器會自動接著當前棧區的結尾來分配內存.

2、堆區(heap)
一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由操作系統回收.類似于鏈表,在內存中的分布不是連續的,它們是不同區域的內存塊通過指針鏈接起來的.一旦某一節點從鏈中斷開,我們要人為的把所斷開的節點從內存中釋放.

3、全局區(靜態區)(static)
全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束后由系統釋放

4、文字常量區
常量字符串就是放在這里的。 程序結束后由系統釋放

5、程序代碼區
存放函數體的二進制代碼。

先看一個例子.
char c; //棧上分配
char *p = new char[3]; //堆上分配,將地址賦給了p;

在 編譯器遇到第一條指令時,計算其大小,然后去查找當前棧的空間是大于所需分配的空間大小,如果這時棧內空間大于所申請的空間,那么就為其分配內存空間,注 意:在這里,內在空間的分配是連續的,是接著上次分配結束后進行分配的.如果棧內空間小于所申請的空間大小,那么這時系統將揭示棧溢出,并給出相應的異常 信息.

編譯器遇到第二條指令時,由于p是在棧上分配的,所以在為p分配內在空間時和上面的方法一樣,但當遇到new關 鍵字,那么編譯器都知道,這是用戶申請的動態內存空間,所以就會轉到堆上去為其尋找空間分配.大家注意:堆上的內存空間不是連續的,它是由相應的鏈表將其 空間區時的內在區塊連接的,所以在接到分配內存空間的指定后,它不會馬上為其分配相應的空間,而是先要計算所需空間,然后再到遍列整個堆(即遍列整個鏈的 節點),將第一次遇到的內存塊分配給它.最后再把在堆上分配的字符數組的首地址賦給p.,這個時候,大家已經清楚了,p中現在存放的是在堆中申請的字符數組的首地址,也就是在堆中申請的數組的地址現在被賦給了在棧上申請的指針變量p.為了更加形象的說明問題,請看下圖:


?

從上圖可以看出,我們在堆上動態分配的數組的首地址存入了指針p所指向的內容.

請注意:在棧上所申請的內存空間,當我們出了變量所在的作用域后,系統會自動我們回收這些空間,而在堆上申請的空間,當出了相應的作用域以后,我們需要顯式 的調用delete來釋放所申請的內存空間,如果我們不及時得對這些空間進行釋放,那么內存中的內存碎片就越來越多,從而我們的實際內存空間也就會變的越 來越少,即,孤立的內存塊越來越多.在這里,我們知道,堆中的內存區域不是連續的,還是將有效的內存區域經過鏈表指針連接起來的,如果我們申請到了某一塊 內存,那么這一塊內存區將會從連續的(通過鏈表連接起來的)內存塊上斷開,如果我們在使用完后,不及時的對它進行釋放,那么它就會孤立的開來,由于沒有任 何指針指向它,所以這個區域將成為內存碎片,所以在使用完動態分配的內存(通過NEW申請)后,一定要顯式的對它進行DELETE刪除.對于這一點,一定 要切記...

上面給大家陳述了它們之間的概念,對于它們倆的使用比較方面,這里我就不能大家斷續陳述了,對于這個問題,網上一網友的文章中闡述的比較詳細,而且附帶了專業的色彩,下面的文章是部分片斷.


申請大小的限制
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。

堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.

另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。


堆和棧中的存儲內容
棧:
在函數調用時,第一個進棧的是主函數中后的下一條指令(函數調用語句的下一條可執行語句)的地址,然后是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然后是函數中的局部變量。注意靜態變量是不入棧的。

當本次函數調用結束后,局部變量先出棧,然后是參數,最后棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。

堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。

存取效率的比較
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";

aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以后的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。

比如:

?

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


對應的匯編代碼

?

?

?


10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al


第一種在讀取時直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據edx讀取字符,顯然慢了。

?

小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度

以上就是棧區和堆區內存分配的區別介紹,為了說明這個問題,小編為大家介紹了內存內部的組織情況,需要的朋友可以過來參考下。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久香蕉国产线看观看亚洲| 亚洲午夜性刺激影院| xxxx欧美18另类的高清| 91亚洲精品视频| 日韩av成人在线观看| 色吧影院999| 亚洲成人黄色网| 奇米影视亚洲狠狠色| 国产精品亚洲视频在线观看| 亚洲国产精品久久久久久| 亚洲成人免费网站| 久久久91精品国产一区不卡| 久久精品亚洲一区| 国产中文字幕91| 欧美性高跟鞋xxxxhd| 91精品视频在线看| 亚洲国产精品系列| 中文字幕亚洲精品| 国产视频福利一区| 国产成人自拍视频在线观看| 18久久久久久| 国产精品久久久久久久午夜| 欧美精品videossex性护士| 久久精品成人欧美大片| 57pao国产精品一区| 成人性生交大片免费看小说| xxx欧美精品| 国产91在线播放九色快色| 精品欧美一区二区三区| 精品国产91久久久久久老师| 欧美激情精品久久久久久大尺度| 精品高清一区二区三区| 欧美成人免费一级人片100| 国语自产偷拍精品视频偷| 欧美高清视频在线播放| 91欧美激情另类亚洲| 国产91精品黑色丝袜高跟鞋| 国产精品视频不卡| 按摩亚洲人久久| 国产97色在线|日韩| 亚洲一级黄色片| 亚洲淫片在线视频| 亚洲欧美国产精品久久久久久久| 亚洲激情免费观看| 不卡av在线网站| 国产精品亚洲精品| 亚洲一区二区三区sesese| 久久久伊人欧美| 亚洲精品自拍第一页| 国产日韩精品在线播放| 亚洲新中文字幕| 欧美另类高清videos| 庆余年2免费日韩剧观看大牛| 国产精品高潮呻吟视频| 91理论片午午论夜理片久久| 91成人国产在线观看| 日韩有码在线播放| 国产欧美日韩精品丝袜高跟鞋| 久久久视频在线| 欧美怡春院一区二区三区| 久久久噜久噜久久综合| 亚洲色图35p| 亚洲成人三级在线| 国产精品专区h在线观看| 国产精品精品视频一区二区三区| 成人久久一区二区| 日韩成人在线免费观看| 日韩成人性视频| 精品国产户外野外| 色狠狠久久aa北条麻妃| 久久精品国产亚洲精品2020| 久久精品国产综合| 亚洲国产成人在线播放| 欧美日韩一区二区三区在线免费观看| 91精品国产沙发| 国产97色在线|日韩| 98午夜经典影视| 日韩高清电影免费观看完整版| 欧美在线一级va免费观看| 精品日韩中文字幕| 欧美午夜精品伦理| 欧洲成人在线视频| 国产欧美日韩综合精品| 亚洲精品免费一区二区三区| 欧美精品videosex牲欧美| 久久久91精品国产一区不卡| 伦伦影院午夜日韩欧美限制| 欧美激情乱人伦| 色综合伊人色综合网| 国产免费亚洲高清| 91麻豆桃色免费看| 日韩va亚洲va欧洲va国产| 亚洲综合中文字幕68页| 日韩在线观看免费高清完整版| 2021久久精品国产99国产精品| 久久频这里精品99香蕉| 日韩精品高清视频| 欧美日韩亚洲系列| 国产成人精品在线| 欧美精品在线免费| 97成人在线视频| 国产一区二区成人| 精品国产精品自拍| 久久天天躁狠狠躁夜夜av| 不卡av在线播放| 国产人妖伪娘一区91| 亚洲午夜性刺激影院| 欧美性受xxx| 亚洲图片欧洲图片av| 黑人与娇小精品av专区| 98精品国产自产在线观看| 欧美中文在线观看| 久久久97精品| 欧美激情一级欧美精品| 国产99久久精品一区二区永久免费| 国产精品亚洲片夜色在线| 美女精品视频一区| 国产精品视频在线播放| 91网站在线看| 国产精品91在线| 日韩精品在线观看一区二区| 欧美性xxxx极品hd欧美风情| 中日韩午夜理伦电影免费| 国产亚洲一级高清| 欧美精品电影免费在线观看| 亚洲日本中文字幕| 中文字幕精品网| 中文字幕日韩视频| 中文字幕国内精品| 欧美午夜精品久久久久久浪潮| 日韩电影中文字幕av| 国产精品一区二区性色av| 日韩精品999| 亚洲精品一区中文字幕乱码| 欧美激情乱人伦一区| 亚洲欧美成人网| 欧美亚洲国产另类| 亚洲精品www久久久久久广东| 992tv成人免费视频| 国产精品91在线| 欧美色videos| 亚洲白虎美女被爆操| 久久久成人的性感天堂| 国产日韩精品电影| 欧美日韩激情小视频| 怡红院精品视频| 欧美一区二粉嫩精品国产一线天| 国产精品夜间视频香蕉| 日韩在线一区二区三区免费视频| 欧美肥婆姓交大片| 日本高清视频一区| 最近2019年好看中文字幕视频| 欧美在线www| 亚洲字幕一区二区| 91久久久久久久久久久久久| 色偷偷偷亚洲综合网另类| 亚洲精品久久久久久久久久久| 国产精品一区二区女厕厕| 久久视频精品在线| 欧美精品性视频| 亚洲精品视频二区| 欧美国产中文字幕| 92福利视频午夜1000合集在线观看| 97色在线播放视频|