国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

五大內(nèi)存分區(qū)(筆記)

這篇具有很好參考價(jià)值的文章主要介紹了五大內(nèi)存分區(qū)(筆記)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、概述

  • 一個(gè)由C/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分 :堆區(qū)、棧區(qū)、全局區(qū)(靜態(tài)區(qū))、文字常量區(qū)、代碼區(qū)五部分。

????????在執(zhí)行一個(gè)C/C++語言程序時(shí),此程序?qū)碛?span style="color:#fe2c24;">唯一的“內(nèi)存四區(qū)”——棧區(qū)、堆區(qū)、全局區(qū)、代碼區(qū)。每個(gè)程序都有唯一的四個(gè)內(nèi)存區(qū)域。

? ? ? ? 1、一個(gè)可執(zhí)行程序在存儲(chǔ)(沒有調(diào)入內(nèi)存)時(shí)分為代碼段、靜態(tài)區(qū)和文字常量區(qū)三部分;

? ? ? ? 2、可執(zhí)行程序(調(diào)入內(nèi)存后)在運(yùn)行時(shí)又多出兩個(gè)區(qū)域:棧區(qū)和堆區(qū)。

內(nèi)存有那5部分,C++學(xué)習(xí)之路,java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言

1、堆區(qū)(heap)? ?—?允許程序在運(yùn)行時(shí)動(dòng)態(tài)地申請(qǐng)某個(gè)大小的內(nèi)存空間,?一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事。

2、棧區(qū)(stack)—? ?由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。

3、全局區(qū)(靜態(tài)區(qū))—,全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,程序結(jié)束后由系統(tǒng)釋放。

4、文字常量區(qū)? ?—常量字符串就是放在這里的,只讀的。程序結(jié)束后由系統(tǒng)釋放。

5、程序代碼區(qū)—存放程序的編譯后的可執(zhí)行二進(jìn)制代碼,CPU執(zhí)行的機(jī)器指令,并且是只讀的。

int   a   =   0;   存放在全局初始化區(qū)

char   *p1;   存放在全局未初始化區(qū)

main()

{

int   b;   棧區(qū)

char   s[]   =   "abc";   棧區(qū)

char   *p2;   棧區(qū)

char   *p3   =   "123456";   123456\0在常量區(qū),p3在棧區(qū)。

static   int   c   =0;   全局(靜態(tài))初始化區(qū)

p1   =   (char   *)malloc(10);

p2   =   (char   *)malloc(20);

分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。

strcpy(p1,   "123456");   123456\0放在常量區(qū),編譯器可能會(huì)將它與p3所指向的
                            "123456"優(yōu)化成一個(gè)地方。

}

二、內(nèi)存分區(qū)運(yùn)行前后的區(qū)別

1、運(yùn)行之前(代碼區(qū)+數(shù)據(jù)區(qū)+未初始化數(shù)據(jù)區(qū))

????????在沒有運(yùn)行程序前(程序沒有加載到內(nèi)存前),分別為 代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)和未初始化數(shù)據(jù)區(qū)(bss)3 個(gè)部分(把 data 和 bss 合起來叫做靜態(tài)區(qū)或全局區(qū))。

  • 代碼區(qū)

????????存放 CPU 執(zhí)行的機(jī)器指令。通常代碼區(qū)是可“共享”的(即另外的執(zhí)行程序可以調(diào)用它),使其可共享的目的是對(duì)于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可(節(jié)約內(nèi)存)。代碼區(qū)是只讀的,使其只讀的原因是防止程序意外的修改了它的指令。另外,代碼區(qū)還規(guī)劃了局部變量的相關(guān)信息。

  • 全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)(data段)

????????該區(qū)包含了在程序中①被初始化的全局變量②已經(jīng)初始化的靜態(tài)變量(包括全局靜態(tài)變量)③常量數(shù)據(jù)(如字符串常量)

  • 未初始化數(shù)據(jù)區(qū)(又叫 bss 區(qū))

????????存入的是全局未初始化靜態(tài)變量。未初始化數(shù)據(jù)區(qū)的數(shù)據(jù)在程序開始執(zhí)行之前被內(nèi)核初始化為 0 或者空(NULL)。

??總體來講,程序源代碼被編譯之后主要分成兩種段:程序指令(代碼區(qū))和程序數(shù)據(jù)(數(shù)據(jù)區(qū))。代碼段屬于程序指令,而數(shù)據(jù)域段和 bss 段屬于程序數(shù)據(jù)。

注:那為什么把程序的指令和程序數(shù)據(jù)分開呢?

  • 程序被加載到內(nèi)存中之后,可以將數(shù)據(jù)和代碼分別映射到兩個(gè)內(nèi)存區(qū)域。由于數(shù)據(jù)區(qū)域?qū)M(jìn)程來說是可讀可寫的,而指令區(qū)域?qū)Τ绦騺碇v是只讀的,所以分區(qū)之后呢,可以將程序指令區(qū)域和數(shù)據(jù)區(qū)域分別設(shè)置成只讀或可讀可寫。這樣可以防止程序的指令有意或者無意被修改。
  • 當(dāng)系統(tǒng)中運(yùn)行著多個(gè)同樣的程序的時(shí)候,這些程序執(zhí)行的指令都是一樣的,所以只需要內(nèi)存中保存一份程序的指令就可以了,只是每一個(gè)程序運(yùn)行中數(shù)據(jù)不一樣而已,這樣可以節(jié)省大量的內(nèi)存。

2、運(yùn)行之后(代碼區(qū)+數(shù)據(jù)區(qū)+未初始化數(shù)據(jù)區(qū)+棧區(qū)+堆區(qū))

????????程序在加載到內(nèi)存前,代碼區(qū)和全局區(qū)(data+ bss)的大小就是固定的,程序運(yùn)行期間不能改變。然后,運(yùn)行可執(zhí)行程序,操作系統(tǒng)把物理硬盤程序加載到內(nèi)存,除了根據(jù)可執(zhí)行程序的信息分出代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)和未初始化數(shù)據(jù)區(qū)(bss)之外,還額外增加了棧區(qū)、堆區(qū)

  • 代碼區(qū)(text segment)

????????加載的是可執(zhí)行文件代碼段,所有的可執(zhí)行代碼都加載到代碼區(qū),這塊內(nèi)存是不可以在運(yùn)行期間修改的。

  • 未初始化數(shù)據(jù)區(qū)(BSS)

????????加載的是可執(zhí)行文件 BSS 段,位置可以分開也可以緊靠數(shù)據(jù)段,存儲(chǔ)于數(shù)據(jù)段的數(shù)據(jù)(全局未初始化,靜態(tài)未初始化數(shù)據(jù))的生存周期是整個(gè)程序運(yùn)行過程。

  • 全局初始化數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū)(data segment)

????????加載的是可執(zhí)行文件數(shù)據(jù)段,存儲(chǔ)于數(shù)據(jù)段(全局初始化,靜態(tài)初始化數(shù)據(jù),文字常量(只讀))的數(shù)據(jù)的生存周期是整個(gè)程序運(yùn)行過程。

  • 棧區(qū)(stack)

????????棧是由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值、返回值、局部變量等。在程序運(yùn)行過程中實(shí)時(shí)加載和釋放,因此,局部變量的生存周期為申請(qǐng)到釋放該段??臻g。

  • 堆區(qū)(heap)

????????堆是一個(gè)大容器,它的容量要遠(yuǎn)遠(yuǎn)大于棧,但沒有棧那樣先進(jìn)后出的順序。用于動(dòng)態(tài)內(nèi)存分配。堆在內(nèi)存中位于 BSS 區(qū)和棧區(qū)之間。一般由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)可能會(huì)由操作系統(tǒng)回收。
內(nèi)存有那5部分,C++學(xué)習(xí)之路,java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言

?三、內(nèi)存分布圖

內(nèi)存有那5部分,C++學(xué)習(xí)之路,java,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言

?四、棧和堆的對(duì)比

棧(stack) 堆(heap)
申請(qǐng)方式 系統(tǒng)自動(dòng)分配 程序員申請(qǐng)
申請(qǐng)效率 棧是系統(tǒng)自動(dòng)分配的,速度較 堆是由new分配的,速度較,且容易產(chǎn)生內(nèi)存碎片,但使用方便
申請(qǐng)大小的限制 在window系統(tǒng)中,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存。棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的。window下,棧的大小是2M(能從棧獲取的空間較?。?。如果申請(qǐng)的空間超過棧的剩余空間,將提示overflow 堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),由于操作系統(tǒng)用鏈表來存儲(chǔ)空閑內(nèi)存地址,故堆是不連續(xù)的內(nèi)存區(qū)域,而且鏈表的遍歷方向是低地址向高地址。由于堆獲取的空間受限于操作系統(tǒng)中有效的虛擬內(nèi)存,故比較靈活,且能獲取的堆空間較大
系統(tǒng)響應(yīng)方式 只要系統(tǒng)剩余空間大于申請(qǐng)空間就能申請(qǐng),否則報(bào)錯(cuò):棧溢出 操作系統(tǒng)有一個(gè)記錄空閑地址的鏈表,當(dāng)系統(tǒng)收到內(nèi)存申請(qǐng)的請(qǐng)求時(shí),會(huì)遍歷該鏈表,尋找第一個(gè)空間大于申請(qǐng)空間的堆結(jié)點(diǎn),然后將該結(jié)點(diǎn)從空閑結(jié)點(diǎn)鏈表中刪除,并將該結(jié)點(diǎn)的空間分配給程序。由于找到的堆結(jié)點(diǎn)的有可能會(huì)大于申請(qǐng)的內(nèi)存大小,系統(tǒng)會(huì)自動(dòng)將多余的那部分重新放入到空閑鏈表中

五、數(shù)據(jù)結(jié)構(gòu)中的堆和內(nèi)存分配中的堆的區(qū)別

1、數(shù)據(jù)結(jié)構(gòu)中的堆

堆的定義:是一棵完全二叉樹結(jié)構(gòu),特點(diǎn)是父節(jié)點(diǎn)的值大于(小于)兩個(gè)子節(jié)點(diǎn)的值(分別稱為大頂堆和小頂堆)。堆是一種經(jīng)過排序的樹形數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都有一個(gè)值。通常我們所說的堆的數(shù)據(jù)結(jié)構(gòu),是指二叉堆。它常用于管理算法執(zhí)行過程中的信息,應(yīng)用場(chǎng)景包括堆排序,優(yōu)先隊(duì)列等。

堆的特點(diǎn):是根結(jié)點(diǎn)的值最小(或最大),且根結(jié)點(diǎn)的兩個(gè)子樹也是一個(gè)堆。由于堆的這個(gè)特性,常用來實(shí)現(xiàn)優(yōu)先隊(duì)列,堆的存取是隨意,

堆的形象例子就如同我們?cè)趫D書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時(shí)不必像棧一樣,先取出前面所有的書,書架這種機(jī)制不同于箱子,我們可以直接取出我們想要的書。

2、內(nèi)存分配中的堆

堆的定義:堆允許程序在運(yùn)行時(shí)動(dòng)態(tài)地申請(qǐng)某個(gè)大小的內(nèi)存空間,從堆中分配的內(nèi)存需要程序員手動(dòng)釋放,如果不釋放,而系統(tǒng)內(nèi)存管理器又不自動(dòng)回收這些堆內(nèi)存的話,那就一直被占用(Java中由JVM虛擬機(jī)的垃圾回收機(jī)制自動(dòng)回收)。如果一直申請(qǐng)堆內(nèi)存,而不釋放,內(nèi)存會(huì)越來越少。文章來源地址http://www.zghlxwxcb.cn/news/detail-615836.html

到了這里,關(guān)于五大內(nèi)存分區(qū)(筆記)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第八十五天學(xué)習(xí)記錄:C++核心:內(nèi)存分區(qū)模型

    第八十五天學(xué)習(xí)記錄:C++核心:內(nèi)存分區(qū)模型

    C++程序在執(zhí)行時(shí),將內(nèi)存大方向劃分為4個(gè)區(qū)域 1、代碼區(qū):存放函數(shù)體的二進(jìn)制代碼,由操作系統(tǒng)進(jìn)行管理 2、全局區(qū):存放全局變量和靜態(tài)變量以及常量 3、棧區(qū):由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等 4、堆區(qū):由程序員分配和釋放,若程序員不釋放,程

    2024年02月12日
    瀏覽(27)
  • Python學(xué)習(xí)之路-內(nèi)存管理

    Python的內(nèi)存管理機(jī)制可以總結(jié)為:引用計(jì)數(shù)、垃圾回收、內(nèi)存池。 引用計(jì)數(shù)是一種非常高效的內(nèi)存管理手段, 當(dāng)一個(gè) Python 對(duì)象被引用時(shí)其引用計(jì)數(shù)增加 1, 當(dāng)其不再被一個(gè)變量引用時(shí)則計(jì)數(shù)減 1. 當(dāng)引用計(jì)數(shù)等于 0 時(shí)對(duì)象被刪除。 引用計(jì)數(shù) 引用計(jì)數(shù)也是一種垃圾收集機(jī)制,

    2024年01月21日
    瀏覽(23)
  • 【JAVA】數(shù)組的概念;數(shù)組的使用;引用;內(nèi)存分區(qū);數(shù)組練習(xí)題

    【JAVA】數(shù)組的概念;數(shù)組的使用;引用;內(nèi)存分區(qū);數(shù)組練習(xí)題

    ??內(nèi)容專欄:【JAVA從0到入門】 ??本文脈絡(luò):數(shù)組的概念;數(shù)組的使用;引用;內(nèi)存分區(qū);數(shù)組練習(xí)題 ??本文作者:Melon_西西 ??發(fā)布時(shí)間 :2023.7.20 目錄 1. 數(shù)組的基本概念 2數(shù)組的創(chuàng)建及初始化 2.1 數(shù)組的創(chuàng)建: T [ ] 數(shù)組名 = new T[N]; 2.2 數(shù)組的初始化 : 動(dòng)態(tài)初始化和靜態(tài)初

    2024年02月16日
    瀏覽(47)
  • 【Redis高手修煉之路】②Redis的五大數(shù)據(jù)類型

    【Redis高手修煉之路】②Redis的五大數(shù)據(jù)類型

    字符串是Redis最基礎(chǔ)的數(shù)據(jù)類型: 字符串類型實(shí)際可以存儲(chǔ)字符串、數(shù)字、二進(jìn)制數(shù)據(jù); Redis中的鍵都是字符串類型,值也支持字符串類型; 字符串類型的存儲(chǔ)空間是有限的,最大可以存放512M的數(shù)據(jù)。 1.1.1 添加、查詢、獲取長(zhǎng)度、字符串的追加 set key value 設(shè)置指定 key 的值 get

    2023年04月19日
    瀏覽(25)
  • 云原生環(huán)境下JAVA應(yīng)用容器JVM內(nèi)存如何配置?—— 筑夢(mèng)之路

    云原生環(huán)境下JAVA應(yīng)用容器JVM內(nèi)存如何配置?—— 筑夢(mèng)之路

    Docker環(huán)境下的JVM參數(shù)非定值配置 —— 筑夢(mèng)之路_docker jvm設(shè)置-CSDN博客 之前簡(jiǎn)單地記錄過一篇,這里在之前的基礎(chǔ)上更加細(xì)化一下。 使用Java開發(fā)且設(shè)置的JVM堆空間過小時(shí),程序會(huì)出現(xiàn)系統(tǒng)內(nèi)存不足OOM(Out of Memory)的問題。事件中心的OOM事件是指系統(tǒng)內(nèi)存不足時(shí),觸發(fā)了Linux的

    2024年02月06日
    瀏覽(22)
  • JVM五大內(nèi)存模型

    JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一個(gè)虛構(gòu)出來的計(jì)算機(jī),有著自己完善的硬件架構(gòu),如處理器、堆棧等。 Java語言使用Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼( 字節(jié)碼 ),就可以在多種平臺(tái)上不加

    2024年02月15日
    瀏覽(39)
  • 【JVM】JVM五大內(nèi)存區(qū)域介紹

    【JVM】JVM五大內(nèi)存區(qū)域介紹

    目錄 ?一、程序計(jì)數(shù)器(線程私有) 二、java虛擬機(jī)棧(線程私有) 2.1、虛擬機(jī)棧 2.2、棧相關(guān)測(cè)試 2.2.1、棧溢出 三、本地方法棧(線程私有) 四、java堆(線程共享) 五、方法區(qū)(線程共享) 六、實(shí)例演示 ????????Java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把它所管理的內(nèi)存劃

    2024年02月15日
    瀏覽(24)
  • 向內(nèi)存安全語言遷移的五大挑戰(zhàn)

    近日,白宮國(guó)家網(wǎng)絡(luò)主任辦公室(ONCD)在題為《回歸基礎(chǔ)構(gòu)件:通往安全軟件之路》的報(bào)告中呼吁開發(fā)者放棄C、C++語言,轉(zhuǎn)而使用“內(nèi)存安全的編程語言”,例如Rust語言。 傳統(tǒng)編程語言C/C++雖然強(qiáng)大,但一直飽受內(nèi)存安全漏洞的困擾。這些漏洞不僅復(fù)雜難懂,而且極易造成

    2024年03月28日
    瀏覽(18)
  • Android 開發(fā)的五大開源網(wǎng)站,安卓?jī)?nèi)存優(yōu)化面試

    Android 開發(fā)的五大開源網(wǎng)站,安卓?jī)?nèi)存優(yōu)化面試

    (4) 多快捷鍵支持 ① 左右翻頁(yè) 在項(xiàng)目(搜索)列表及詳情頁(yè)左手黨可以通過 awsd,右手黨可通過上下左右鍵或者 nl 鍵翻頁(yè),瀏覽項(xiàng)目從未有過的流暢體驗(yàn)。 ② 快速打標(biāo)簽 項(xiàng)目詳情頁(yè)可通過 t 快速進(jìn)入新增標(biāo)簽輸入框,回車確定標(biāo)簽,Esc 退出編輯。 ③ 快速搜索 項(xiàng)目列表頁(yè)可通

    2024年04月09日
    瀏覽(112)
  • redis學(xué)習(xí)筆記 - 進(jìn)階部分

    redis學(xué)習(xí)筆記 - 進(jìn)階部分

    單線程:主要是指Redis的網(wǎng)絡(luò)IO和鍵值對(duì)讀寫是由一個(gè)線程來完成的,Redis在處理客戶端的請(qǐng)求時(shí)包括獲取 (socket 讀)、解析、執(zhí)行、內(nèi)容返回 (socket 寫) 等都由一個(gè)順序串行的主線程處理,這就是所謂的“單線程”。這也是Redis對(duì)外提供鍵值存儲(chǔ)服務(wù)的主要流程。 多線程:主要

    2024年02月11日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包