日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存结构

發(fā)布時(shí)間:2024/10/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0.代碼段:存放函數(shù)二進(jìn)制代碼的區(qū)域;

1.RO DATA只讀數(shù)據(jù)段(靜態(tài)區(qū)域):存儲(chǔ)不可改變的常量,無論局部還是全局的;

2.RW DATA讀寫數(shù)據(jù)段(靜態(tài)區(qū)域):存儲(chǔ)可改變的,全局變量(前提是定義的時(shí)候直接初始化),或者用static修飾的局部變量(也需要先初始化):static只在當(dāng)前的{}程序代碼段中有效;

3.BBS未初始化數(shù)據(jù)區(qū)(靜態(tài)區(qū)域):分為全局和局部的區(qū)別,都會(huì)放在這里,只有初始化后,才會(huì)放到對(duì)應(yīng)的?;蛘逺W,RO DATA,(定義的時(shí)候即初始化除外)靜態(tài)區(qū)域的未初始化的變量存放在這里,存放未初始化的變量平時(shí)沒有的,在程序運(yùn)行時(shí)動(dòng)態(tài)生成(所以平時(shí)exe里面不包含這個(gè)的大小),需編譯器明確指定大小(因?yàn)槲闯跏蓟?#xff09;;

4.函數(shù)內(nèi)部局部變量,不用static或const申明的,都放在棧上,棧上的數(shù)據(jù)會(huì)自動(dòng)釋放。主要存儲(chǔ):局部變量,形參,返回值,變量空間在函數(shù)開始前開辟,結(jié)束后回收;

5.用malloc,free的都放在堆上面,可以隨時(shí)申請(qǐng),需要主動(dòng)釋放:
應(yīng)用:
const char *ptrConst = "fdsfadf"; 字符串常量放在RO DATA,而加了const修飾的指針,由于是全局的,肯定在靜態(tài)區(qū)域(RO DATA),但是ptrConst指向的內(nèi)容不可改變,本身指向的地址是可變的,所以ptrConst放在RW DATA (這里是指全局情況,如果是局部這么定義,ptrConst會(huì)存儲(chǔ)在棧上面;
const char const *ptrConst = "fdsfadf"; 這樣兩者都會(huì)放在RO DATA;
const char a[] = "fsdfds"; 數(shù)組不同于指針,兩個(gè)都放在RO DATA,可以認(rèn)為數(shù)組完全等價(jià)于"fsdfsds",不可改變;
const指針: const char *p = XXX p可變,*p是const;
const (char *)p = XXX p是const,*p可變;
const char * const p = xxx 最強(qiáng)約束,都是const 即const離那個(gè)近,哪個(gè)就是const了,但還可以直接放在后面:
char const *p = XXX //p可變,*p是const (char ) const p = XXX //p是const,p可變
char * const p = XXX///p是const,p可變
char const * const p = xxx //最強(qiáng)約束,都是const 沿著號(hào)劃一條線,如果const位于的左側(cè),則const就是用來修飾指針?biāo)赶虻淖兞?#xff0c;即指針指向?yàn)槌A?#xff1b;
如果const位于的右側(cè),const就是修飾指針本身,即指針本身是常量??梢愿鶕?jù)這個(gè)規(guī)則來看上面聲明的實(shí)際意義,相信定會(huì)一目了然。 注意:
①用const定義的全局變量,如果要存儲(chǔ),必須存儲(chǔ)函數(shù)也指明是const才行,否則是無法從外部讀取的,只能引用。
②只讀數(shù)據(jù)定義的時(shí)候一般都是做完整的初始化,否則多余未初始化的空間也是無法適用的,因?yàn)樵赗O DATA里面

6.堆和棧:能不靈活就不靈活,這樣效率相對(duì)會(huì)比較高一點(diǎn)
大小:棧是一個(gè)固定大小的內(nèi)存空間,超過的話會(huì)提示over flow,堆則是鏈表,和內(nèi)存大小有關(guān);
效率:堆更加靈活,相對(duì)效率就會(huì)低很多,棧比較死板,但是效率高(堆由操作系統(tǒng)維護(hù),棧是程序維護(hù)的)
棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。
堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的,例如為了分配一塊內(nèi)存,庫(kù)函數(shù)會(huì)按照一定的算法(具體的算法可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可
能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機(jī)會(huì)分到足夠大小的內(nèi)存,然后進(jìn)行返回。顯然,堆的效率比棧要低得多。

注意:
(1)堆:char *s1=”hellow tigerjibo”;是在編譯是就確定的 (2)棧:char s1[]=”hellow tigerjibo”;是在運(yùn)行時(shí)賦值的;用數(shù)組比用指針?biāo)俣雀煲恍?#xff0c;指針在底層匯編中需要用edx寄存器中轉(zhuǎn)一下,而數(shù)組在棧上讀取。 同樣是只讀數(shù)據(jù)區(qū)的數(shù)據(jù),用數(shù)組來獲取會(huì)比用指針快一點(diǎn);
(2)棧:在函數(shù)調(diào)用時(shí),第一個(gè)進(jìn)棧的主函數(shù)中后的下一條語句的地址,然后是函數(shù)的各個(gè)參數(shù),參數(shù)是從右往左入棧的,然后是函數(shù)中的局部變量。注:靜態(tài)變量是不入棧的。
當(dāng)本次函數(shù)調(diào)用結(jié)束后,局部變量先出棧,然后是參數(shù),最后棧頂指針指向最開始存的地址,也就是主函數(shù)中的下一條指令,程序由該點(diǎn)繼續(xù)執(zhí)行;
(3)堆:一般是在堆的頭部用一個(gè)字節(jié)存放堆的大小,后面直接存儲(chǔ)內(nèi)容,只要記住地址就可以用啦,比較靈活。
堆是操作系統(tǒng)存儲(chǔ)空閑的內(nèi)存空間地址的一個(gè)鏈表,每次申請(qǐng)后,從鏈表中找出空間》=申請(qǐng)大小的節(jié)點(diǎn),
釋放出來給程序用(多出來的部分再在鏈表上面生成新的節(jié)點(diǎn)),一般空間首部會(huì)存儲(chǔ)本次分配的大小,這樣方便free的時(shí)候,進(jìn)行空間釋放,釋放后再次作為節(jié)點(diǎn)存放到鏈表中。 說明:對(duì)于堆來講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來講,則不會(huì)存在這個(gè)問題,
?

總結(jié)

以上是生活随笔為你收集整理的内存结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。