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

淺談C++內(nèi)存管理基礎(chǔ)知識(shí)

 更新時(shí)間:2021年11月18日 11:29:44   作者:胡代洲  
這篇文章主要為大家介紹了C++的內(nèi)存管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

概述

內(nèi)存管理的原理龐大而復(fù)雜,然而這些都被操作系統(tǒng)進(jìn)行了封裝,并對(duì)外預(yù)留了API,這些api被c++調(diào)用,同時(shí)也被c++再次進(jìn)行了封裝,再面向程序員預(yù)留出了語(yǔ)法特性的接口,作為使用c++的程序員,我們只需要掌握c++預(yù)留的內(nèi)存管理特性即可,就像我們開(kāi)車不需要管變數(shù)箱、發(fā)動(dòng)機(jī)是怎么變速、點(diǎn)火的,我們只需要掌握汽車給我們預(yù)留的接口,方向盤(pán)、剎車、油門(mén)如何使用即可。

c++程序容易出bug,主要就是因?yàn)閮?nèi)存管理部分的復(fù)雜性 ,java、python等語(yǔ)言提供了更多的封裝,所以降低了程序員的操作難度和犯錯(cuò)的可能。就像自動(dòng)檔的汽車一樣,沒(méi)有了離合,自然就不會(huì)因操作失誤把變速箱損壞。

c++可用內(nèi)存

c語(yǔ)言的可用內(nèi)存

在c語(yǔ)言中我們的可用內(nèi)存主要分以下幾個(gè)區(qū)域:

  • 棧,用于存放局部變量。
  • 全局?jǐn)?shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū),用于存放全局變量和靜態(tài)局部變量。
  • const數(shù)據(jù)區(qū),該區(qū)域在內(nèi)存中實(shí)際是沒(méi)有指定分區(qū)的,他存在于全局?jǐn)?shù)據(jù)區(qū)或者棧中,const不能被修改是被編譯器限制的,在物理內(nèi)存中根本就沒(méi)有只讀類型的內(nèi)存。所以有時(shí)候我們?cè)谟懻摲謪^(qū)的時(shí)候,不會(huì)提到const區(qū),因?yàn)樗揪蜎](méi)有獨(dú)立存在。
  • 代碼段,當(dāng)然是用來(lái)存放代碼,在linux下,我們的可執(zhí)行代碼從rom中讀取到內(nèi)存中執(zhí)行,雖說(shuō)內(nèi)存可讀可寫(xiě),但是在操作系統(tǒng)的監(jiān)控下,這段內(nèi)存也是只讀不寫(xiě)的區(qū)域。
  • 堆,c中的堆由malloc申請(qǐng),free釋放,底層也是由操作系統(tǒng)提供給我們的程序的一段內(nèi)存。

c++新增內(nèi)存區(qū)域

c中的內(nèi)存分區(qū)在c++中全部都存在,而c++新增了自由存儲(chǔ)區(qū),使用new來(lái)申請(qǐng),delet來(lái)釋放,實(shí)際和malloc申請(qǐng)的內(nèi)存在一個(gè)區(qū)域,new使用內(nèi)存示例如下:

int *p = new int;
*p=6;
cout << "*p=" << *p << endl;
delete p;

new和malloc

linux平臺(tái)中new內(nèi)部其實(shí)還是通過(guò)malooc來(lái)申請(qǐng)的內(nèi)存,只是附加做了些其他工作,例如調(diào)用類的構(gòu)造函數(shù)來(lái)初始化。malloc返回的就像一塊荒地,需要你自己來(lái)規(guī)劃,而new返回的是一個(gè)修好基建的區(qū)域給你。

malloc

new

c庫(kù)函數(shù)

運(yùn)算符、關(guān)鍵字

分配空間由傳參決定

大小由數(shù)據(jù)類型決定,編譯器自動(dòng)計(jì)算

返回值void *

明確的類型,申請(qǐng)啥返回啥

free釋放

delete、delet[ ]釋放

申請(qǐng)內(nèi)存不初始化

可以隱式和顯示初始化

無(wú)構(gòu)造函數(shù)

執(zhí)行構(gòu)造函數(shù)

申請(qǐng)失敗返回NULL

申請(qǐng)失敗返回bad_alloc異常

智能指針引入

我們說(shuō),cpu決定了匯編指令、匯編決定了c和c++,所以c/c++的指針是天然的,用來(lái)支持匯編的間接尋址,可以說(shuō)是cpu決定的指針。所以指針是無(wú)法避開(kāi)的,指針的優(yōu)勢(shì)是太靈活,劣勢(shì)也是太靈活,尤其是與動(dòng)態(tài)內(nèi)存、構(gòu)造、析構(gòu)結(jié)合使用后容易出錯(cuò),所以c++發(fā)明了一種智能指針,有程序員和專門(mén)設(shè)計(jì)的自動(dòng)管理機(jī)制共同把控以減少出錯(cuò)。這種自動(dòng)管理機(jī)制在c中就有體現(xiàn),如棧就是自動(dòng)管理的結(jié)果。

智能指針是普通指針的升級(jí)版,本身具備指針的功能,且多出一些自動(dòng)釋放資源的機(jī)制,當(dāng)然,智能指針的使用會(huì)比普通指針要多消耗一些資源和開(kāi)銷。在c++中,智能指針不是唯一的,有很多類型的智能指針,各有優(yōu)劣和適應(yīng)的場(chǎng)景。使用智能指針時(shí),須按照設(shè)計(jì),正確使用,否則容易導(dǎo)致災(zāi)難。

智能指針的實(shí)現(xiàn)

將普通指針?lè)庋b為棧式復(fù)合指針對(duì)象,內(nèi)部包含了除了真正指向目標(biāo)的指針外還有些其他東西,如使用次數(shù)記錄等,要使用智能指針,我們需要注意以下問(wèn)題:

  • 將智能指針本身定義為局部(棧上),實(shí)現(xiàn)指針本身被自動(dòng)回收的。
  • 智能指針內(nèi)部設(shè)計(jì)為當(dāng)指針本身要被彈棧釋放時(shí),執(zhí)行事先掛接好的清理函數(shù),也就是說(shuō)智能指針內(nèi)部應(yīng)該有一個(gè)函數(shù)指針,指向我們的清理函數(shù)。
  • 智能指針需要使用庫(kù)為其提供的方法和運(yùn)算符來(lái)重載使用。

java延伸

java語(yǔ)言整體框架

為了保證知識(shí)的完整,我們簡(jiǎn)單的介紹一下java的內(nèi)容,來(lái)了解一些優(yōu)質(zhì)方法。

cpu ->系統(tǒng)內(nèi)核 -> 應(yīng)用層框架 -> java虛擬機(jī) -> Java字節(jié)碼 -> java源碼

從上面的架構(gòu),我們能看出來(lái),java比c/c++多了三層,java的源碼編譯輸出的并不是cpu可執(zhí)行的機(jī)器碼,而是被編譯成java字節(jié)碼,這個(gè)東西完全是java自己定義的一種東西,只能在JVM(java虛擬機(jī))上運(yùn)行, JVM再基于一些內(nèi)核提供的框架來(lái)運(yùn)行,所以說(shuō)java是一種解釋性語(yǔ)言,他完全靠JVM進(jìn)行解釋,而c/c++是編譯型語(yǔ)言,源碼直接編譯成cpu可執(zhí)行的機(jī)器碼。正因?yàn)橛辛薐VM,所以java可以跨平臺(tái)運(yùn)行,哪里有JVM哪里就可以運(yùn)行java,前提是不同平臺(tái)的JVM能相互兼容,java的運(yùn)行穩(wěn)定性取決于JVM。

java的垃圾回收機(jī)制

java有一個(gè)專門(mén)做垃圾回收的守護(hù)進(jìn)程,GC線程,他內(nèi)部使用GC機(jī)制和算法來(lái)得到生命周期結(jié)束的變量對(duì)象,把這些對(duì)象當(dāng)成垃圾進(jìn)行回收。

實(shí)際上垃圾回收并不是java的專利,其他語(yǔ)言,如c#也有類似的設(shè)計(jì)理念,典型的就是他們都沒(méi)有指針,其垃圾回收機(jī)制讓程序員免于考慮對(duì)象的生命周期和資源的申請(qǐng)與釋放,使得這門(mén)語(yǔ)言非常好學(xué),其實(shí)垃圾回收機(jī)制的背后都是以效率和內(nèi)存資源為代價(jià),換來(lái)的不易出錯(cuò),簡(jiǎn)單好用。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 深入了解C++中常用的三個(gè)智能指針

    深入了解C++中常用的三個(gè)智能指針

    C++是一門(mén)強(qiáng)大的編程語(yǔ)言,但是在內(nèi)存管理方面卻存在著一些問(wèn)題。手動(dòng)管理內(nèi)存不僅費(fèi)時(shí)費(fèi)力,而且容易出錯(cuò)。因此,C++中引入了智能指針這一概念,以更好地管理內(nèi)存,下面就來(lái)詳細(xì)講講C++中常用的三個(gè)智能指針吧
    2023-05-05
  • C語(yǔ)言實(shí)現(xiàn)奇數(shù)階魔方陣的方法

    C語(yǔ)言實(shí)現(xiàn)奇數(shù)階魔方陣的方法

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)奇數(shù)階魔方陣的方法,涉及數(shù)組及相關(guān)數(shù)學(xué)函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 淺析C語(yǔ)言中assert的用法

    淺析C語(yǔ)言中assert的用法

    以下是對(duì)C語(yǔ)言中assert的使用方法進(jìn)行了介紹,需要的朋友可以參考下
    2013-07-07
  • c++代碼實(shí)現(xiàn)tea加密算法的實(shí)例詳解

    c++代碼實(shí)現(xiàn)tea加密算法的實(shí)例詳解

    這篇文章主要介紹了c++代碼實(shí)現(xiàn)tea加密算法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C++實(shí)現(xiàn)簡(jiǎn)單射擊小游戲

    C++實(shí)現(xiàn)簡(jiǎn)單射擊小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單射擊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C語(yǔ)言?使用qsort函數(shù)來(lái)進(jìn)行快速排序

    C語(yǔ)言?使用qsort函數(shù)來(lái)進(jìn)行快速排序

    排序方法有很多種:選擇排序,冒泡排序,歸并排序,快速排序等。?看名字都知道快速排序是目前公認(rèn)的一種比較好的排序算法。因?yàn)樗俣群芸?,所以系統(tǒng)也在庫(kù)里實(shí)現(xiàn)這個(gè)算法,便于我們的使用。?這就是qsort函數(shù)
    2022-02-02
  • C語(yǔ)言函數(shù)調(diào)用堆棧詳情分析

    C語(yǔ)言函數(shù)調(diào)用堆棧詳情分析

    這篇文章主要介紹了C語(yǔ)言函數(shù)調(diào)用堆棧詳情分析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • C語(yǔ)言中實(shí)現(xiàn)“17進(jìn)制”轉(zhuǎn)“10進(jìn)制”實(shí)例代碼

    C語(yǔ)言中實(shí)現(xiàn)“17進(jìn)制”轉(zhuǎn)“10進(jìn)制”實(shí)例代碼

    這篇文章主要介紹了C語(yǔ)言中實(shí)現(xiàn)“17進(jìn)制”轉(zhuǎn)“10進(jìn)制”實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++實(shí)現(xiàn)俄羅斯方塊源碼

    C++實(shí)現(xiàn)俄羅斯方塊源碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)俄羅斯方塊源碼完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++如何調(diào)用簡(jiǎn)單的python程序

    C++如何調(diào)用簡(jiǎn)單的python程序

    這篇文章主要介紹了C++如何調(diào)用簡(jiǎn)單的python程序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

富民县| 辽源市| 许昌县| 德清县| 正宁县| 大庆市| 西宁市| 民丰县| 灌云县| 许昌市| 南澳县| 庆安县| 兖州市| 江川县| 西城区| 平度市| 中西区| 蓬安县| 钟山县| 酒泉市| 大足县| 东乌| 祁东县| 邯郸市| 谢通门县| 利津县| 文山县| 安顺市| 炎陵县| 金秀| 长乐市| 长武县| 武宣县| 宜兰县| 千阳县| 大荔县| 怀柔区| 霞浦县| 磐安县| 海林市| 中西区|