女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是堆內(nèi)存?堆內(nèi)存是如何分配的?

電子工程師 ? 來(lái)源:?jiǎn)纹瑱C(jī)匠人 ? 作者:蔡琰老師 ? 2021-07-05 17:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上一篇我們分享了棧內(nèi)存的概念,現(xiàn)在我們分享下堆內(nèi)存的概念。

在一般的編譯系統(tǒng)中,堆內(nèi)存的分配方向和棧內(nèi)存是相反的。當(dāng)棧內(nèi)存從高地址向低地址增長(zhǎng)的時(shí)候,堆內(nèi)存從低地址向高地址分配。

C語(yǔ)言中,堆內(nèi)存在分配和釋放的時(shí)候,是程序通過調(diào)用C語(yǔ)言的庫(kù)函數(shù)完成的。這和棧內(nèi)存的分配有區(qū)別,棧內(nèi)存利用的是處理器的硬件機(jī)制,而堆內(nèi)存的處理使用的是庫(kù)函數(shù)。

我們來(lái)看下堆內(nèi)存的分配情況:

在堆內(nèi)存的分配過程中,每次分配將返回一個(gè)當(dāng)前分配地址的指針。在程序中如果多次分配內(nèi)存,可以得到多個(gè)內(nèi)存指針,每個(gè)內(nèi)存指針都是本次分配內(nèi)存的地址。在釋放內(nèi)存的時(shí)候,只需要對(duì)每個(gè)指針進(jìn)行操作,那個(gè)指針?biāo)赶虻膬?nèi)存就會(huì)被釋放,而對(duì)其他的內(nèi)存區(qū)域沒有影響。

從內(nèi)存的分配和使用上,可以看出棧內(nèi)存和堆內(nèi)存的區(qū)別:棧內(nèi)存只有一個(gè)入口點(diǎn),就是棧指針,棧內(nèi)存壓入和彈出的時(shí)候棧指針將發(fā)生變化,棧指針標(biāo)識(shí)當(dāng)前棧區(qū)域中已使用和未使用的界限,程序在訪問棧內(nèi)存的時(shí)候都只能通過棧指針及其偏移量;而堆內(nèi)存有多個(gè)入口點(diǎn),每次分配得到的指針是訪問內(nèi)存的入口,每個(gè)分配內(nèi)存區(qū)域都可以被單獨(dú)釋放,程序?qū)Χ褍?nèi)存可以通過每次分配得到的指針訪問。

堆內(nèi)存有一個(gè)整體分配的過程,按照向上的堆內(nèi)存分配方向。隨著堆內(nèi)存使用量的增加,堆內(nèi)存將逐漸向高地址分配。這只是一個(gè)大體的增長(zhǎng)的方面,在堆內(nèi)存中,已使用的區(qū)域和未使用的區(qū)域是交錯(cuò)的,而不是像棧區(qū)域那樣有明顯的分界線。

堆內(nèi)存的釋放看下面這個(gè)圖:

看到這樣頻繁的使用區(qū)域和釋放,那么很容易看出堆內(nèi)存是不連續(xù)的,跟堆內(nèi)存的使用方式有關(guān)系,這個(gè)分配就相對(duì)自由靈活了,但是也是會(huì)在低地址向高地址發(fā)展的方向分配的。

比如上面釋放后再分配就可以是下面兩種情況:

先看再次分配1的情況:當(dāng)新分配的需求比中間(剛剛釋放)區(qū)域小,那么就會(huì)在緊接著的區(qū)域給分配。

再看再次分配2的情況:當(dāng)新分配的需求比中間(釋放的)區(qū)域大,那么只能往后尋求能給的區(qū)域。

當(dāng)頻繁的分配和釋放內(nèi)存的過程中,會(huì)很容易出現(xiàn)在兩塊已經(jīng)分配的內(nèi)存之間較小的未分配內(nèi)存區(qū)域,這些其實(shí)可以用,但是由于他們的空間比較小,不夠連續(xù)內(nèi)存的分配,所以分配的時(shí)候就很難再次使用,這些較小的內(nèi)存就是我們常說(shuō)的內(nèi)存碎片。

我們?cè)賮?lái)聊一下在C程序中堆空間的使用。

在C語(yǔ)言中,堆內(nèi)存區(qū)域的分配和釋放是通過調(diào)用庫(kù)函數(shù)來(lái)完成的,實(shí)現(xiàn)的函數(shù)主要有四個(gè):

void *malloc(size_t size); //分配內(nèi)存空間

void free(void *ptr); //釋放內(nèi)存空間

void *calloc(size_t nmemb,size_t size); //分配內(nèi)存空間

void *realloc(void * ptr,size_t size); //重新分配內(nèi)存空間

注意:使用上面這幾個(gè)函數(shù)需要包含標(biāo)準(zhǔn)庫(kù)文件

那么庫(kù)函數(shù)怎么使用呢,內(nèi)存分配了就要有釋放,那么常用的就是malloc()和free()兩個(gè)函數(shù)。malloc()函數(shù)的輸入是需要分配內(nèi)存的大小,輸出是分配內(nèi)存的指針。如果分配不成功,則返回NULL。

free()函數(shù)的輸入是需要釋放的指針,可以接受任何形式的指針。這個(gè)指針必須是由分配函數(shù)分配出來(lái)的。

例如:

int *pa;

pa = (int *)malloc(sizeof(int));//分配一個(gè)int大小的指針

if(NULL != pa)

{

free(pa);

}

內(nèi)存使用完成需要釋放,以便分配給其他程序使用。

calloc()也是內(nèi)存分配的,只是可以把分配好的內(nèi)存區(qū)域的初始值全部設(shè)置為0。還有這個(gè)分配內(nèi)存有兩個(gè)參數(shù),第一個(gè)是分配單元的大小,第二個(gè)是要分配的數(shù)目。

malloc(sizeof(unsigned int)*10); == calloc(sizeof(unsigned int),10)

realloc()有兩個(gè)參數(shù),一個(gè)是指向內(nèi)存的地址指針,一個(gè)是要重分配內(nèi)存的大小,返回值是指向所分配內(nèi)存的指針。

1、當(dāng)參數(shù)指針為NULL的時(shí)候,作為malloc使用,分配內(nèi)存。

2、當(dāng)重分配內(nèi)存大小為0的時(shí)候,作為free使用,釋放內(nèi)存。

3、當(dāng)指針和重分配內(nèi)存大小均不為0的時(shí)候,根據(jù)指針指向的堆內(nèi)存區(qū)域的情況和指針大小重新分配內(nèi)存。

對(duì)于realloc()作為重新分配內(nèi)存的時(shí)候,有三種可能出現(xiàn):

1、縮小內(nèi)存

2、擴(kuò)大內(nèi)存,不需要移動(dòng)指針

3、擴(kuò)大內(nèi)存,需要移動(dòng)指針(指定內(nèi)存區(qū)域大小不夠)

在堆內(nèi)存的管理上,主要容易出現(xiàn)以下幾個(gè)問題:

1、開辟的內(nèi)存沒有釋放,造成內(nèi)存泄漏(系統(tǒng)不會(huì)釋放任何用戶分配的內(nèi)存)

2、野指針被使用或釋放(內(nèi)存釋放后,需要將內(nèi)存指針置為NULL)

3、非法釋放指針(分配了有效內(nèi)存才存在釋放,否則是非法的)

在C語(yǔ)言語(yǔ)法的方面對(duì)棧內(nèi)存和堆內(nèi)存如何使用沒有限制。然后從使用的角度,棧內(nèi)存更適用于容量較小的單個(gè)變量(例如:C語(yǔ)言的基本變量類型、較小的結(jié)構(gòu)體和數(shù)組),堆內(nèi)存則適用于開辟較大塊的內(nèi)存。棧內(nèi)存由編譯器分配和釋放,堆內(nèi)存由程序員分配和釋放。

責(zé)任編輯:lq6

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3124

    瀏覽量

    75268
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141736

原文標(biāo)題:堆內(nèi)存的那些事

文章出處:【微信號(hào):gh_e7f294a514ca,微信公眾號(hào):?jiǎn)纹瑱C(jī)匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用LAX_CODEGEN啟用動(dòng)態(tài)內(nèi)存分配

    我目前正在探索NXP_MBDToolbox_LAX。lax_codegen 生成的代碼基于靜態(tài)分配。我想管理大型向量,如何使用 LAX_CODEGEN 啟用動(dòng)態(tài)內(nèi)存分配
    發(fā)表于 04-10 08:09

    :整流電路的“中流砥柱”

    大家好!今天我們來(lái)聊一聊電子電路中一個(gè)非常重要的元器件——橋。無(wú)論是家用電器、工業(yè)設(shè)備,還是通信設(shè)備,橋都扮演著不可或缺的角色。它雖然看起來(lái)不起眼,但卻是整流電路的“中流砥柱”。那么,橋到底是
    的頭像 發(fā)表于 04-01 17:07 ?867次閱讀

    golang內(nèi)存分配

    作者:錢文 Go 的分配采用了類似 tcmalloc 的結(jié)構(gòu).特點(diǎn): 使用一小塊一小塊的連續(xù)內(nèi)存頁(yè), 進(jìn)行分配某個(gè)范圍大小的內(nèi)存需求. 比如某個(gè)連續(xù) 8KB 專門用于
    的頭像 發(fā)表于 03-31 15:00 ?185次閱讀
    golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    hyper v 內(nèi)存,hyper v 內(nèi)存設(shè)置的操作步驟和方法是什么?

    在利用Hyper-V搭建和管理虛擬機(jī)的過程中,合理設(shè)置虛擬機(jī)的內(nèi)存至關(guān)重要。內(nèi)存分配是否恰當(dāng),會(huì)直接影響到虛擬機(jī)的運(yùn)行性能和穩(wěn)定性。若內(nèi)存分配
    的頭像 發(fā)表于 01-24 15:22 ?676次閱讀
    hyper v <b class='flag-5'>內(nèi)存</b>,hyper v <b class='flag-5'>內(nèi)存</b>設(shè)置的操作步驟和方法是什么?

    養(yǎng)成良好的編程習(xí)慣|內(nèi)存初值不一定是0

    ;} 代碼很簡(jiǎn)單,使用 malloc 申請(qǐng)一段內(nèi)存,假設(shè)內(nèi)存空間足夠大。 通過 getchar 配合 while 循環(huán),從標(biāo)準(zhǔn)輸入獲取一個(gè)字符串,直到遇到換行符結(jié)束。 最后就是把獲取的字符串輸出。 乍一看,好像程序沒什么問題。
    的頭像 發(fā)表于 12-18 09:14 ?376次閱讀

    C語(yǔ)言中申請(qǐng)的內(nèi)存能不能自動(dòng)釋放

    C語(yǔ)言中申請(qǐng)的內(nèi)存能不能自動(dòng)釋放?每次都要手動(dòng) free 太麻煩,也容易忘記。 學(xué)過 C++ 的同學(xué),應(yīng)該首先能想到智能指針。 但是這是C語(yǔ)言,沒有類和對(duì)象、構(gòu)造析構(gòu)這些技術(shù),想要自動(dòng)釋放很難
    的頭像 發(fā)表于 11-27 09:33 ?521次閱讀

    Windows管理內(nèi)存的三種主要方式

    Windows操作系統(tǒng)提供了多種方式來(lái)管理內(nèi)存,以確保系統(tǒng)資源的有效利用和性能的優(yōu)化。以下是關(guān)于Windows管理內(nèi)存的三種主要方式的詳細(xì)闡述,包括內(nèi)存管理、虛擬
    的頭像 發(fā)表于 10-12 17:09 ?2384次閱讀

    談JVM xmx, xms等內(nèi)存相關(guān)參數(shù)合理性設(shè)置

    的,提高內(nèi)存占用(Memory Footprint)就有可能同時(shí)優(yōu)化這兩個(gè)標(biāo)的,這篇文章就來(lái)聊聊內(nèi)存相關(guān)內(nèi)容。 內(nèi)存占用一般指應(yīng)用運(yùn)行需要的所有內(nèi)存,包括
    的頭像 發(fā)表于 10-10 14:42 ?1339次閱讀

    邏輯內(nèi)存和物理內(nèi)存的區(qū)別

    邏輯內(nèi)存和物理內(nèi)存是計(jì)算機(jī)系統(tǒng)中兩個(gè)重要的概念,它們?cè)谟?jì)算機(jī)的運(yùn)行和數(shù)據(jù)處理中起著至關(guān)重要的作用。 1. 物理內(nèi)存(Physical Memory) 物理內(nèi)存,也稱為RAM(Rando
    的頭像 發(fā)表于 09-27 15:38 ?1774次閱讀

    轉(zhuǎn)載 golang內(nèi)存分配

    Go 的分配采用了類似 tcmalloc 的結(jié)構(gòu).特點(diǎn): 使用一小塊一小塊的連續(xù)內(nèi)存頁(yè), 進(jìn)行分配某個(gè)范圍大小的內(nèi)存需求. 比如某個(gè)連續(xù) 8KB 專門用于
    的頭像 發(fā)表于 09-05 14:12 ?494次閱讀
    轉(zhuǎn)載 golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    內(nèi)存管理的硬件結(jié)構(gòu)

    常見的內(nèi)存分配函數(shù)有malloc,mmap等,但大家有沒有想過,這些函數(shù)在內(nèi)核中是怎么實(shí)現(xiàn)的?換句話說(shuō),Linux內(nèi)核的內(nèi)存管理是怎么實(shí)現(xiàn)的?
    的頭像 發(fā)表于 09-04 14:28 ?659次閱讀
    <b class='flag-5'>內(nèi)存</b>管理的硬件結(jié)構(gòu)

    如何自定義內(nèi)存控制器的設(shè)置

    在FreeRTOS中自定義內(nèi)存控制器的設(shè)置,主要涉及到內(nèi)存分配策略的選擇和配置。FreeRTOS提供了多種內(nèi)存分配策略,如heap_1、he
    的頭像 發(fā)表于 09-02 14:28 ?931次閱讀

    堆棧和內(nèi)存的基本知識(shí)

    本文主要聊聊關(guān)于堆棧的內(nèi)容。包括堆棧和內(nèi)存的基本知識(shí)。常見和堆棧相關(guān)的 bug,如棧溢出,內(nèi)存泄漏,內(nèi)存分配失敗等。后面介紹軟件中堆棧統(tǒng)計(jì)
    的頭像 發(fā)表于 08-29 14:10 ?1044次閱讀
    堆棧和<b class='flag-5'>內(nèi)存</b>的基本知識(shí)

    如何使用SystemView的監(jiān)控功能

    SystemView能夠監(jiān)視應(yīng)用程序如何使用動(dòng)態(tài)存儲(chǔ)。這意味著,如果應(yīng)用程序中使用了C或C++、自定義或RTOS提供的內(nèi)存池對(duì)象,我們可以跟蹤這些對(duì)象的使用情況。SystemView可以在一個(gè)
    的頭像 發(fā)表于 08-09 18:07 ?1343次閱讀
    如何使用SystemView的<b class='flag-5'>堆</b>監(jiān)控功能

    NONOS 1.5.3/1.5.4 SSL內(nèi)存泄漏的原因?

    我已經(jīng)通過隨附的代碼驗(yàn)證了當(dāng)發(fā)生 SSL 握手錯(cuò)誤時(shí),會(huì)生成內(nèi)存泄漏 此外,espconn_reconnect_callback不稱為信令ESPCONN_HANDSHAKE - TCP SSL 握手
    發(fā)表于 07-18 07:24