最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于C++使用指針 堆和棧的區(qū)別分析

 更新時(shí)間:2013年04月19日 11:41:57   作者:  
本篇文章小編為大家介紹,關(guān)于C++使用指針 堆和棧的區(qū)別分析。需要的朋友參考下

數(shù)據(jù)在內(nèi)存的存放有以下幾種形式

1.棧區(qū)--由編譯器自動(dòng)分配并且釋放,該區(qū)域一般存放函數(shù)的參數(shù)值,局部變量的值等,
2.堆區(qū)--一般由程序員分配釋放,如果程序員不釋放,程序結(jié)束的時(shí)候才會(huì)被操作系統(tǒng)回收,
3.寄存器區(qū)--用來保存棧頂指針和指令指針
4.全局去--也是靜態(tài)區(qū),全局變量和靜態(tài)變量都是存儲(chǔ)在一起的,初始化的全局變量和靜態(tài)變量都存儲(chǔ)在一塊,為初始化的全局變量和靜態(tài)變量在相鄰的另一個(gè)區(qū)域,程序結(jié)束后由系統(tǒng)釋放。
5.文字常量區(qū)--常量字符串就是放在這里的,程序結(jié)束后由系統(tǒng)釋放,
6.程序代碼區(qū)--存放函數(shù)的二進(jìn)制代碼。

函數(shù)參數(shù)和局部變量存放在棧中,函數(shù)運(yùn)行結(jié)束或者返回系統(tǒng)就釋放了他們所占用的內(nèi)存空間,但是全局變量不會(huì)被系統(tǒng)釋放掉。全局的只有在程序結(jié)束后才會(huì)被系統(tǒng)所釋放,而且由于全局變量被所有的類成員和函數(shù)所共享,很容易被修改,為了解決這一問題
我們會(huì)使用堆

堆棧的區(qū)別

1.申請(qǐng)方式的不同

堆是程序員自己申請(qǐng)
而棧則是有程序判斷局部變量或者函數(shù) 系統(tǒng)來自動(dòng)分配

2.系統(tǒng)的響應(yīng)不同

棧-只要棧的剩余空間大于所申請(qǐng)的空間,系統(tǒng)將為程序提供內(nèi)存,否則將提示棧溢出 overflow

堆- 系統(tǒng)收到程序中申請(qǐng)的控件后,會(huì)遍歷一個(gè)操作系統(tǒng)用來記錄內(nèi)存控件地址得鏈表,當(dāng)找到一個(gè)空間大于所申請(qǐng)控件的堆結(jié)點(diǎn)后就會(huì)將該節(jié)點(diǎn)從記錄內(nèi)存空閑地址的鏈表中刪除,并將結(jié)點(diǎn)的內(nèi)存分配給程序,然后在這塊區(qū)域的首地址處記錄分配的大小,     這樣我們?cè)谑褂胐elete來釋放內(nèi)存的時(shí)候,delete才能正確的識(shí)別并刪除該內(nèi)存區(qū)域的所有變量,另外我們申請(qǐng)的內(nèi)存空間與堆結(jié)點(diǎn)上的內(nèi)存空間不一定相等,這時(shí)候系統(tǒng)就會(huì)自動(dòng)將堆結(jié)點(diǎn)上的多出來的一部分內(nèi)存空間回收到空閑鏈表中

3、空間的大小不同

棧-在windows狀態(tài)下,棧是一塊連續(xù)的內(nèi)存的區(qū)域,它的大小是2M,也有的說1M,總之這個(gè)數(shù)值是一編譯的時(shí)候就確定的常數(shù),是由系統(tǒng)預(yù)先根據(jù)棧頂?shù)牡刂泛蜅5淖畲笕萘慷x好的,加入你的數(shù)據(jù)申請(qǐng)的內(nèi)存空間超過棧的空間,就會(huì)提示overflow,所以別指望棧能夠存儲(chǔ)比較大的數(shù)據(jù)。

堆-堆是不連續(xù)的內(nèi)存區(qū)域,各塊區(qū)域由鏈表將他們串起來,這些串聯(lián)起來的內(nèi)存空間叫做堆,他的大小是由系統(tǒng)中虛擬的內(nèi)存來定的,因此獲得的空間比較大,而且獲得空間的方式也比較靈活。

4.執(zhí)行效率的不同

棧-棧由系統(tǒng)自動(dòng)分配,因此速度比較快,但是程序員不能對(duì)其進(jìn)行操作。
堆-堆是程序員分配的內(nèi)存,     一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來很方便。

5.執(zhí)行函數(shù)的不同

棧-在函數(shù)調(diào)用的時(shí)候,第一個(gè)進(jìn)棧的是被調(diào)用函數(shù)下一行的內(nèi)存地址,其次是函數(shù)的參數(shù),假如參數(shù)多余一個(gè),那么次序是從左往右,最后才是函數(shù)的局部變量。

由于棧的先進(jìn)后出原則,函數(shù)結(jié)束時(shí)正好相反,先是局部變量先出棧,然后是參數(shù),次序是從左向右,這時(shí)所偶的變量都出棧,指針自然的第一個(gè)進(jìn)棧的那行內(nèi)存地址,也就是被調(diào)用函數(shù)的下一行內(nèi)存地址,程序根據(jù)該地址跳轉(zhuǎn)到調(diào)用函數(shù)的下一行自動(dòng)執(zhí)行。

由于棧的先進(jìn)后出原則,所以他永遠(yuǎn)不可能產(chǎn)生內(nèi)存碎片

堆--堆是一大堆不連續(xù)的內(nèi)存區(qū)域,在系統(tǒng)中由鏈表將他們串聯(lián)起來,因此在使用的時(shí)候必須由程序員來安排,他的機(jī)制是很復(fù)雜的,有時(shí)候?yàn)榱朔峙湟粔K合適的內(nèi)存,程序員需要按照一定的算法在堆內(nèi)存中搜索可用的足夠大的空間,如果沒有滿足條件的空間,那么就要向內(nèi)存中發(fā)出申請(qǐng)一部分內(nèi)存空間,這樣才能有機(jī)會(huì)分配足夠大的內(nèi)存,然后將計(jì)算后的數(shù)值返回,顯然堆的運(yùn)行效率比棧低很多,而且容易產(chǎn)生碎片,但是好處是堆可以存儲(chǔ)相當(dāng)?shù)拇蟮臄?shù)據(jù),并且一些細(xì)節(jié)可以由程序員來安排。

以上就是堆棧的區(qū)別 但是在應(yīng)用中的取舍還是具體問題具體分析

相關(guān)文章

  • c++ string的erase刪除方法

    c++ string的erase刪除方法

    這篇文章主要介紹了c++ string的erase刪除方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C/C++的浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式分析及實(shí)例

    C/C++的浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式分析及實(shí)例

    這篇文章主要介紹了C/C++的浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式分析及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • C++程序函數(shù)的重載和函數(shù)模板示例代碼

    C++程序函數(shù)的重載和函數(shù)模板示例代碼

    C++允許在同一作用域中用同一函數(shù)名定義多個(gè)函數(shù),這些函數(shù)的參數(shù)個(gè)數(shù)和參數(shù)類型不相同,這些同名的函數(shù)用來實(shí)現(xiàn)不同的功能,這就是函數(shù)的重載,這篇文章主要介紹了C++程序函數(shù)的重載和函數(shù)模板,需要的朋友可以參考下
    2024-03-03
  • C語言金幣陣列問題解決方法

    C語言金幣陣列問題解決方法

    這篇文章主要介紹了C語言金幣陣列問題解決方法,主要涉及數(shù)組的靈活運(yùn)算,是一類非常經(jīng)典的算法,需要的朋友可以參考下
    2014-09-09
  • C++ 中strcpy標(biāo)準(zhǔn)寫法實(shí)例詳解

    C++ 中strcpy標(biāo)準(zhǔn)寫法實(shí)例詳解

    這篇文章主要介紹了C++ 中strcpy標(biāo)準(zhǔn)寫法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++下程序運(yùn)行時(shí)間的四種常用計(jì)時(shí)方法總結(jié)

    C++下程序運(yùn)行時(shí)間的四種常用計(jì)時(shí)方法總結(jié)

    這篇文章主要介紹了C++下程序運(yùn)行時(shí)間的四種常用計(jì)時(shí)方法,介紹了幾種常用的計(jì)時(shí)方法,包括低精度的clock()和GetTickCount(),以及高精度的gettimeofday()和QueryPerformanceCounter(),需要的朋友可以參考下
    2024-09-09
  • C/C++字符串查找函數(shù)全面了解

    C/C++字符串查找函數(shù)全面了解

    下面小編就為大家?guī)硪黄狢/C++字符串查找函數(shù)全面了解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • C++數(shù)據(jù)序列化方式(自定義結(jié)構(gòu)體的保存和讀取)

    C++數(shù)據(jù)序列化方式(自定義結(jié)構(gòu)體的保存和讀取)

    這篇文章主要介紹了C++數(shù)據(jù)序列化方式(自定義結(jié)構(gòu)體的保存和讀取),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++ 實(shí)現(xiàn)L2-002 鏈表去重

    C++ 實(shí)現(xiàn)L2-002 鏈表去重

    這篇文章主要介紹了C++ 實(shí)現(xiàn)L2-002 鏈表去重,本文通過簡(jiǎn)要的案例,解題思路講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言char s[]和char* s的區(qū)別

    C語言char s[]和char* s的區(qū)別

    本文主要介紹了C語言char s[]和char* s的區(qū)別,詳細(xì)講述了數(shù)組,指針的使用,具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06

最新評(píng)論

巴彦县| 惠水县| 伊通| 龙南县| 龙井市| 平谷区| 衡阳县| 平乡县| 扶余县| 原平市| 大洼县| 大连市| 阜南县| 阿鲁科尔沁旗| 鄂托克前旗| 博兴县| 兴山县| 平远县| 延津县| 罗甸县| 徐州市| 贡山| 普格县| 平罗县| 青川县| 仙桃市| 托克托县| 峡江县| 壶关县| 冷水江市| 万源市| 东港市| 益阳市| 武威市| 河北省| 新竹县| 肃宁县| 盈江县| 密山市| 祁东县| 恩平市|