姓名:王重月? 學(xué)號:21021211019? ?學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:(30條消息) 嵌入式面經(jīng)_Oliver.H的博客-CSDN博客_嵌入式面經(jīng)
【嵌牛導(dǎo)讀】程序的內(nèi)存分配榆芦、堆與棧的區(qū)別瓣喊、數(shù)組與指針
【嵌牛鼻子】程序內(nèi)存分配、堆與棧敞临、數(shù)組與指針
【嵌牛提問】堆與棧的區(qū)別节腐?數(shù)組與指針的區(qū)別外盯?
【嵌牛正文】一個(gè)由c/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分:
1、棧區(qū)(stack)—由編譯器自動分配釋放翼雀,存放函數(shù)的參數(shù)值饱苟,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧狼渊。
2箱熬、堆區(qū)(heap)—一般由程序員分配釋放,若程序員不釋放狈邑,程序結(jié)束時(shí)可能由OS回收城须。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表
3米苹、全局區(qū)(靜態(tài)區(qū))(static)—全局變量和靜態(tài)變量的存儲是放在一塊的糕伐,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域蘸嘶。程序結(jié)束后由系統(tǒng)釋放良瞧。
4、文字常量區(qū)—常量字符串就是放在這里的训唱。程序結(jié)束后由系統(tǒng)釋放褥蚯。
5、程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼
堆與棧的區(qū)別
(1)管理方式:堆中資源由程序員控制(通過malloc/free况增、new/delete赞庶,容易產(chǎn)生memory leak),棧資源由編譯器自動管理澳骤。
(2)系統(tǒng)響應(yīng):對于堆歧强,系統(tǒng)有一個(gè)記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序申請時(shí)宴凉,遍歷該鏈表誊锭,尋找第一個(gè)大于所申請空間的空間的堆結(jié)點(diǎn),刪除空閑結(jié)點(diǎn)鏈表中的該結(jié)點(diǎn)弥锄,并將該結(jié)點(diǎn)空間分配給程序(大多數(shù)系統(tǒng)會在這塊內(nèi)存空間首地址記錄本次分配的大小,這樣delete才能正確釋放本內(nèi)存空間,另外籽暇,系統(tǒng)會將多余的部分重新放入空閑鏈表中)温治。對于棧,只要棧的剩余空間大于所申請空間戒悠,系統(tǒng)就會為程序分配內(nèi)存熬荆,否則報(bào)異常出現(xiàn)棧空間溢出錯(cuò)誤绸狐。
(3)空間大新笨摇:堆是不連續(xù)的內(nèi)存區(qū)域(因?yàn)橄到y(tǒng)是用鏈表來存儲空閑內(nèi)存地址的,自然不是連續(xù))寒矿,堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存(32位機(jī)器上理論上是4G大型涣铡),所以堆的空間比較靈活符相,比較大拆融。棧是一塊連續(xù)的內(nèi)存區(qū)域,大小是操作系統(tǒng)預(yù)定好的啊终,windows下棧大小是2M(也有是1M镜豹,在編譯時(shí)確定,VC中可設(shè)置)蓝牲。
(4)碎片問題:對于堆趟脂,頻繁的new/delete會造成大量內(nèi)存碎片,降低程序效率例衍。對于棧散怖,它是一個(gè)先進(jìn)后出(first-in-last-out)的結(jié)構(gòu),進(jìn)出一一對應(yīng)肄渗,不會產(chǎn)生碎片镇眷。
(5)生長方向:堆向上,向高地址方向增長翎嫡;棧向下欠动,向低地址方向增長。
(6)分配方式:堆是動態(tài)分配(沒有靜態(tài)分配的堆)惑申。棧有靜態(tài)分配和動態(tài)分配具伍,靜態(tài)分配由編譯器完成(如函數(shù)局部變量),動態(tài)分配由alloca函數(shù)分配圈驼,但棧的動態(tài)分配資源由編譯器自動釋放人芽,無需程序員實(shí)現(xiàn)。
(7)分配效率:堆由C/C++函數(shù)庫提供绩脆,機(jī)制很復(fù)雜萤厅,因此堆的效率比棧低很多橄抹。棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)在底層對棧提供支持惕味,分配專門的寄存器存放棧地址楼誓,提供棧操作專門的指令。
簡述數(shù)組與指針的區(qū)別名挥?
數(shù)組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局?jǐn)?shù)組)疟羹,要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任意類型的內(nèi)存塊禀倔。
(1)修改內(nèi)容上的差別
2) 用運(yùn)算符sizeof 可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))榄融。sizeof§ 為指針得到的是一個(gè) 指針變量的字節(jié)數(shù),而不是p所指的內(nèi)存容量救湖。C++/C 語言沒有辦法知道指針?biāo)傅膬?nèi)存容量愧杯,除非在申請內(nèi)存時(shí)記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí)捎谨,該數(shù)組自動退化為同類型的指針民效。
————————————————
版權(quán)聲明:本文為CSDN博主「Oliver.H」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議涛救,轉(zhuǎn)載請附上原文出處鏈接及本聲明畏邢。
原文鏈接:https://blog.csdn.net/weixin_43253519/article/details/107523751