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

C++內(nèi)存分布及用法

 更新時(shí)間:2022年01月24日 16:50:09   作者:一個(gè)熱愛(ài)學(xué)習(xí)的深度渣渣  
這篇文章主要介紹了C++內(nèi)存分布及用法,從內(nèi)存的基礎(chǔ)概念到內(nèi)存分配進(jìn)行了講解,內(nèi)存是我們開(kāi)發(fā)中最重要的一部分,往往邏輯上的錯(cuò)誤就會(huì)造成內(nèi)存泄漏,導(dǎo)致程序無(wú)法運(yùn)行,下面我們就來(lái)了解文章對(duì)該內(nèi)容的詳細(xì)介紹

一、內(nèi)存基礎(chǔ)

1、內(nèi)存分布

通過(guò)下面一張圖看看C++的內(nèi)存分布:

棧區(qū):由編譯器自動(dòng)分配與釋放,存放為程序運(yùn)行時(shí)函數(shù)分配的局部變量、函數(shù)參數(shù);棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配內(nèi)存的容量有限;

堆區(qū):由newmalloc分配的內(nèi)存塊,釋放由應(yīng)用程序控制,不需要編譯器釋放;如果程序員沒(méi)有對(duì)該內(nèi)存進(jìn)行釋放,程序結(jié)束后系統(tǒng)自動(dòng)回收,堆的地方比棧大很多;

靜態(tài)區(qū):存放的是static的靜態(tài)變量和一些全局變量,特點(diǎn)是只讀、大小固定;靜態(tài)變量和全局變量的存儲(chǔ)期是一起的,一旦靜態(tài)區(qū)的內(nèi)存被分配,要一直等到程序全部結(jié)束后才釋放;

2、棧區(qū)與堆區(qū)的區(qū)別

1、分配方式不同:棧區(qū)系統(tǒng)分配系統(tǒng)回收;堆區(qū)由程序員手動(dòng)申請(qǐng),需要求程序員自行回收,如果沒(méi)有回收,系統(tǒng)在程序結(jié)束后會(huì)進(jìn)行回收,這種情況會(huì)造成內(nèi)存泄漏;

2、生命周期不同:棧區(qū)生命周期是系統(tǒng)分配到系統(tǒng)回收,也就是在大括號(hào)內(nèi);堆區(qū)是從申請(qǐng)到釋放;

3、效率不同:主要原因是地址空間是否連續(xù),棧區(qū)地址空間是連續(xù)的,效率會(huì)高一些;堆區(qū)地址空間不連續(xù),需要遍歷鏈表才能找到最近的地址,效率會(huì)低一些;

4、內(nèi)存碎片:堆區(qū)容易產(chǎn)生內(nèi)存碎片,棧區(qū)不會(huì);

5、生長(zhǎng)方向不同:棧區(qū)申請(qǐng)空間的地址(表示地址的八個(gè)十六進(jìn)制數(shù))是從大到小的,堆區(qū)申請(qǐng)空間地址是從小到大的。棧區(qū)是先進(jìn)后出的原則,類比棧結(jié)構(gòu)的特點(diǎn);

  • 棧區(qū)特點(diǎn):更好的局部性,對(duì)象自動(dòng)銷毀;
  • 堆區(qū)特點(diǎn):運(yùn)行期動(dòng)態(tài)擴(kuò)展,需要顯示釋放;

注意點(diǎn):申請(qǐng)的空間是在堆區(qū),變量本身是在棧區(qū)!

二、內(nèi)存分配

1、內(nèi)存分配方式

可操作的內(nèi)存分配:

  • 靜態(tài)存儲(chǔ)區(qū)分配:static靜態(tài)變量、全局變量;
  • 棧上分配:局部變量;
  • 堆上分配:new、malloc進(jìn)行內(nèi)存分配;

不可操作的內(nèi)存分配:

內(nèi)核區(qū)、代碼區(qū)、局部變量的分配也屬于系統(tǒng)分配;

2、new的用法

C++中通常使用new、delete來(lái)構(gòu)造和銷毀對(duì)象;

使用new創(chuàng)建對(duì)象,返回的是對(duì)象的首地址,需要用指針接收:

int *y = new int(2);
std::cout << *y << std::endl;

對(duì)象的構(gòu)建和銷毀分為兩步:分配內(nèi)存、所分配內(nèi)存上構(gòu)造對(duì)象(銷毀與之類似);

new的幾種常見(jiàn)形式:

  • new int(2) :構(gòu)造單一對(duì)象、new int[5]:構(gòu)造數(shù)組;
  • nothrow new:標(biāo)準(zhǔn)庫(kù)定義,解決內(nèi)存分配失敗異常的問(wèn)題;
  • placement new:使用已經(jīng)創(chuàng)建的內(nèi)存,跳過(guò)分配內(nèi)存;
  • new auto;

3、delete用法

根據(jù)分配的是單一對(duì)象還是數(shù)組,采用相應(yīng)的方式銷毀;

int *y = new int[3];
delete[] y;

不能delete一個(gè)非new返回的內(nèi)存(也就是棧內(nèi)存);
delete nullptr是可被允許的;
同一塊內(nèi)存不能delete多次;

4、new與malloc的區(qū)別

  new不需要指定分配多大,malloc使用的時(shí)候必須指定大??;new的底層實(shí)現(xiàn)就是malloc,兩者都必須釋放內(nèi)存,不否則容易造成野指針或內(nèi)存泄漏。需要注意一點(diǎn),釋放內(nèi)存后需設(shè)置相關(guān)指針為空指針;

總結(jié):

  • 屬性:new為關(guān)鍵字(編譯器),malloc是庫(kù)函數(shù)(需引入頭文件);
  • 參數(shù):new無(wú)需指定大小,malloc需指定大小;
  • 返回類型:new返回對(duì)象指針,malloc返回void*;
  • 對(duì)于自定義的類:new會(huì)調(diào)用構(gòu)造和析構(gòu)函數(shù),malloc不會(huì)調(diào)用構(gòu)造和析構(gòu)函數(shù);
  • 分配失?。?/strong>new會(huì)拋出異常,malloc會(huì)返回空;

5、內(nèi)存泄漏

是指由于疏忽或錯(cuò)誤造成程序未能釋放掉不再使用的內(nèi)存的情況,內(nèi)存泄漏并非指內(nèi)存在物理上的小時(shí),而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去該段內(nèi)存的控制從而造成內(nèi)存浪費(fèi);

可能的原因:

  • 1、申請(qǐng)后未釋放(最常見(jiàn))
  • 2、void* 指針的釋放
  • 3、new[] 回收時(shí)沒(méi)有用delete[] ,數(shù)組的回收要注意

三、內(nèi)存拓展

1、內(nèi)存概念

  計(jì)算機(jī)重要部件之一,是外存與CPU進(jìn)行溝通的橋梁。計(jì)算機(jī)所有程序都是在內(nèi)存運(yùn)行的,因此內(nèi)存的性能對(duì)計(jì)算機(jī)的影響非常大。內(nèi)存也稱為內(nèi)存儲(chǔ)器和主存儲(chǔ)器,作用是暫時(shí)存放CPU的運(yùn)算數(shù)據(jù),以及與硬盤等外部存儲(chǔ)器交換的數(shù)據(jù);

尋址空間:保存內(nèi)存地址的多少,通常我們說(shuō)的4G內(nèi)存,就表示計(jì)算機(jī)能保存2的32次方個(gè)地址,也就是能找到這些地址上的二進(jìn)制信息;

尋址能力:每個(gè)地址里能存多少個(gè)bit,現(xiàn)在的計(jì)算機(jī)大多數(shù)是16位機(jī)器了;

2、虛擬內(nèi)存

使得系統(tǒng)運(yùn)行實(shí)際的內(nèi)存空間比想象的大得多,虛擬內(nèi)存是可以遠(yuǎn)大于物理內(nèi)存的,同時(shí)主要為了使程序運(yùn)行的時(shí)候可以不限制于只訪問(wèn)內(nèi)存大小,可以通過(guò)虛擬內(nèi)存地址去訪問(wèn)磁盤空間;

每一個(gè)進(jìn)程虛擬內(nèi)存都是獨(dú)立的,獨(dú)立的享有計(jì)算機(jī)的內(nèi)存。虛擬內(nèi)存地址的大小是與地址總線位數(shù)相關(guān),物理內(nèi)存地址的大小是與物理內(nèi)存條的容量與磁盤容量相關(guān)。

四、思考

1、代碼中的b屬于棧區(qū)還是堆區(qū)?

void fun()
{
 int *b = new int[14];
}

b是在棧區(qū)的變量,由于b是一個(gè)局部變量,隨著函數(shù)域 的結(jié)束被釋放,不需要程序員自行釋放,盡管b使用new進(jìn)行初始化,還是可以認(rèn)為分配在棧區(qū);

總結(jié):

本次系統(tǒng)的從內(nèi)存的基礎(chǔ)概念到內(nèi)存分配進(jìn)行了講解,內(nèi)存是我們開(kāi)發(fā)中最重要的一部分,往往邏輯上的錯(cuò)誤就會(huì)造成內(nèi)存泄漏,導(dǎo)致程序無(wú)法運(yùn)行?;蛘咭恍┓峙鋬?nèi)存的方式不夠細(xì)心,也會(huì)造成冗余內(nèi)存的使用。在目前的很多嵌入式板子上,針對(duì)內(nèi)存的接口是必備的,往往也都是基于malloc修改;
還有一點(diǎn)需要注意,不管任何機(jī)器上運(yùn)行程序,操作的都是虛擬內(nèi)存,內(nèi)部通過(guò)頁(yè)表定位到對(duì)應(yīng)的物理內(nèi)存。關(guān)于硬件方面的本質(zhì),如果做嵌入式端的話需要深入研究。

到此這篇關(guān)于C++內(nèi)存分布及用法的文章就介紹到這了,更多相關(guān)C++內(nèi)存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Matlab復(fù)刻舉牌加油小人生成器

    利用Matlab復(fù)刻舉牌加油小人生成器

    upuptoyou是一款非常有創(chuàng)意的小工具,可以在線生成舉牌小人,看起來(lái)很可愛(ài),也比較有趣,并能用于表白,或節(jié)日送祝福等場(chǎng)景。本文將用Matlab復(fù)刻這一小工具,需要的可以參考一下
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)bmp圖像平移操作

    C語(yǔ)言實(shí)現(xiàn)bmp圖像平移操作

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)bmp圖像平移操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 深入解析C++中的auto自動(dòng)類型推導(dǎo)

    深入解析C++中的auto自動(dòng)類型推導(dǎo)

    C++標(biāo)準(zhǔn)委員會(huì)在C++11標(biāo)準(zhǔn)中改變了auto關(guān)鍵字的語(yǔ)義,使它變成一個(gè)類型占位符,允許在定義變量時(shí)不必明確寫出確切的類型,讓編譯器在編譯期間根據(jù)初始值自動(dòng)推導(dǎo)出它的類型,下面我們就來(lái)看看auto自動(dòng)類型推導(dǎo)的推導(dǎo)規(guī)則吧
    2024-04-04
  • Qt中PaintEvent繪制實(shí)時(shí)波形圖的實(shí)現(xiàn)示例

    Qt中PaintEvent繪制實(shí)時(shí)波形圖的實(shí)現(xiàn)示例

    本文主要介紹了Qt中PaintEvent繪制實(shí)時(shí)波形圖的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • CMake的簡(jiǎn)單應(yīng)用

    CMake的簡(jiǎn)單應(yīng)用

    這篇文章主要介紹了CMake的簡(jiǎn)單應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C語(yǔ)言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++中vector的實(shí)現(xiàn)方法示例詳解

    C++中vector的實(shí)現(xiàn)方法示例詳解

    這篇文章主要介紹了C++中vector實(shí)現(xiàn)的相關(guān)資料,vector是C++中重要的容器之一,底層通過(guò)三個(gè)迭代器實(shí)現(xiàn),分別是_start,?_finish,?和_end_of_storage,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • 深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法

    深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法

    這篇文章主要介紹了深入學(xué)習(xí)C語(yǔ)言中memset()函數(shù)的用法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言常用占位符的使用小結(jié)

    C語(yǔ)言常用占位符的使用小結(jié)

    占位符是一種用于格式化輸出的特殊字符,通常用于 printf() 等輸出函數(shù)中,本文主要介紹了C語(yǔ)言常用占位符的使用小結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2023-05-05
  • c++ priority_queue用法入門超詳細(xì)教程

    c++ priority_queue用法入門超詳細(xì)教程

    priority_queue即優(yōu)先級(jí)隊(duì)列,它的使用場(chǎng)景很多,它底層是用大小根堆實(shí)現(xiàn)的,可以用log(n)的時(shí)間動(dòng)態(tài)地維護(hù)數(shù)據(jù)的有序性,這篇文章主要介紹了c++ priority_queue用法入門超詳細(xì)教程,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

永州市| 临朐县| 巴青县| 会理县| 文成县| 屏东县| 海阳市| 广宗县| 肥东县| 荔浦县| 安达市| 宣恩县| 嘉义市| 阿鲁科尔沁旗| 斗六市| 芦溪县| 武宣县| 宁化县| 宁南县| 呈贡县| 新宾| 周至县| 西乌珠穆沁旗| 河西区| 海安县| 赣州市| 莱芜市| 秦安县| 盐源县| 绥阳县| 泽库县| 阜康市| 扎鲁特旗| 大石桥市| 山东省| 集贤县| 连山| 青神县| 江北区| 卢氏县| 县级市|