欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中內(nèi)存分區(qū)及其作用分析

 更新時(shí)間:2023年04月20日 10:45:45   作者:何曾參靜謐  
C++內(nèi)存分區(qū)包括棧區(qū)、堆區(qū)、全局靜態(tài)區(qū)、常量區(qū),各自負(fù)責(zé)不同的數(shù)據(jù)存儲(chǔ)和回收,棧區(qū)主要用于存放函數(shù)局部變量和參數(shù),堆區(qū)用于動(dòng)態(tài)分配內(nèi)存,全局靜態(tài)區(qū)用于存放全局靜態(tài)變量和靜態(tài)成員變量,常量區(qū)用于存放常量和字符串常量

術(shù)語(yǔ)

內(nèi)存四大區(qū):

  • 代碼區(qū):存放函數(shù)體的二進(jìn)制代碼,由操作系統(tǒng)進(jìn)行管理的
  • 全局區(qū):存放全局變量和靜態(tài)變量以及常量
  • 棧區(qū):由編譯器自動(dòng)分配釋放, 存放函數(shù)的參數(shù)值,局部變量等
  • 堆區(qū):由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)由操作系統(tǒng)回收

內(nèi)存的低地址與高地址:

低地址:存放在內(nèi)存中地址小的位置(存放中的變量和數(shù)據(jù))

高地址:存放在內(nèi)存中地址大的位置(存放程序指令)

一、文本區(qū)(Text Segment)/代碼區(qū)

也稱為代碼段,存放程序代碼。在程序編譯以后,代碼被編譯成機(jī)器碼,并保存在Text Segment中。它通常是只讀的,防止程序出現(xiàn)意外的修改。同時(shí),代碼段也是可共享的。多個(gè)相同的程序可共享同一份代碼,從而節(jié)省內(nèi)存空間。

二、數(shù)據(jù)區(qū)(Data Segment)/全局區(qū)

也稱為靜態(tài)數(shù)據(jù)區(qū),存放定義的全局變量、靜態(tài)變量等數(shù)據(jù)。數(shù)據(jù)區(qū)也分為兩個(gè)部分,即初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段。初始化數(shù)據(jù)段存放已經(jīng)初始化過(guò)的全局變量和靜態(tài)變量。未初始化數(shù)據(jù)段存放未經(jīng)初始化的全局變量和靜態(tài)變量,該區(qū)域的值默認(rèn)為0。

三、棧區(qū)(Stack Segment)

棧區(qū)存放函數(shù)調(diào)用時(shí)的局部變量、參數(shù)等數(shù)據(jù),系統(tǒng)根據(jù)函數(shù)調(diào)用的嵌套情況來(lái)自動(dòng)管理?xiàng)^(qū)。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),函數(shù)的參數(shù)和返回地址被壓入棧中,然后分配一定的??臻g存儲(chǔ)局部變量。當(dāng)函數(shù)返回時(shí),返回值和之前壓入棧中的返回地址被取出,??臻g被釋放。在棧區(qū)分配變量和空間時(shí),會(huì)從高地址往低地址分配內(nèi)存。這是因?yàn)闂^(qū)存儲(chǔ)數(shù)據(jù)的方式類似于數(shù)據(jù)的堆疊,后壓入的數(shù)據(jù)會(huì)被放在先前數(shù)據(jù)的上面,而先壓入的數(shù)據(jù)會(huì)被放在下面。每次分配棧內(nèi)存時(shí),棧指針會(huì)向下移動(dòng),每次釋放棧內(nèi)存時(shí),棧指針會(huì)向上移動(dòng)。(自頂向下分配內(nèi)存)

四、堆區(qū)(Heap Segment)

動(dòng)態(tài)分配內(nèi)存的區(qū)域,程序員在程序運(yùn)行時(shí)可以向操作系統(tǒng)申請(qǐng)一定大小的內(nèi)存。在堆區(qū)分配的內(nèi)存由程序員負(fù)責(zé)管理,使用完畢后,程序員需要調(diào)用釋放內(nèi)存系統(tǒng)來(lái)釋放內(nèi)存,以防止內(nèi)存泄漏的發(fā)生。在堆區(qū)分配內(nèi)存時(shí),會(huì)從低地址往高地址分配,因?yàn)椴僮飨到y(tǒng)在分配空間時(shí)會(huì)記錄哪些空間已經(jīng)被分配出去。所以在分配時(shí)需要先查找堆區(qū)中未被分配的內(nèi)存空間,并且需要記錄本次分配所占用的空間大小和地址。(自底向上分配內(nèi)存)

舉例

//全局區(qū)
int global_variable = 0;//全局變量
static int static_variable = 1;//靜態(tài)變量
const int global_const_variable = 10;//全局常量
int main() {
	//棧區(qū)
    int local_variable = 2;
	const int const_variable = 0;
	//堆區(qū)
	int* ptr = (int*)malloc(sizeof(int));//c語(yǔ)言形式在堆區(qū) 1 個(gè) int 類型變量的內(nèi)存空間	
	free(ptr);// 釋放指針 ptr 指向的內(nèi)存空間
	int* p = new int[10]; // C++在堆區(qū)申請(qǐng) 10 個(gè) int 類型變量的內(nèi)存空間	
	delete[] p; // 釋放指針 p 指向的內(nèi)存空間
    return 0;
}

那么在編譯后,程序?qū)⒈粍澐譃樗膫€(gè)區(qū)域:

代碼區(qū):

存放main函數(shù)的機(jī)器碼。

全局區(qū):

存放定義的全局變量global_variable和靜態(tài)變量static_variable。其中,global_variable存放在初始化數(shù)據(jù)段,static_variable存放在未初始化數(shù)據(jù)段。

堆區(qū):

在程序運(yùn)行過(guò)程中,可以使用mallocnew函數(shù)向堆區(qū)申請(qǐng)一定大小的內(nèi)存空間。

棧區(qū): 存放main函數(shù)的局部變量local_variable、函數(shù)參數(shù)和返回地址等數(shù)據(jù)。

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

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)經(jīng)典小游戲井字棋的示例代碼

    C語(yǔ)言實(shí)現(xiàn)經(jīng)典小游戲井字棋的示例代碼

    這個(gè)三子棋游戲是在學(xué)習(xí)C語(yǔ)言的過(guò)程中自己編寫的一個(gè)小游戲,現(xiàn)在將自己的思路(主要以流程圖形式和代碼中的注釋表達(dá))和具體代碼以及運(yùn)行結(jié)果分享出來(lái)以供大家學(xué)習(xí)參考,希望對(duì)大家有所幫助
    2022-11-11
  • 詳解C語(yǔ)言中二分查找的運(yùn)用技巧

    詳解C語(yǔ)言中二分查找的運(yùn)用技巧

    本文主要介紹了二分查找在實(shí)際中的應(yīng)用,通過(guò)分析幾個(gè)應(yīng)用二分查找的實(shí)例,總結(jié)下能使用二分查找算法的一些共同點(diǎn),感興趣的可以了解一下
    2022-03-03
  • C++賦值運(yùn)算符

    C++賦值運(yùn)算符

    這篇文章主要介紹了C++賦值運(yùn)算符,C++當(dāng)中允許類對(duì)象賦值,這是通過(guò)默認(rèn)的重載賦值運(yùn)算符實(shí)現(xiàn)的,下面我們就來(lái)介紹介紹該內(nèi)容吧,,需要的朋友可以參考一下
    2022-01-01
  • 詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符

    詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符

    這篇文章主要介紹了詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C/C++中關(guān)于std::string的compare陷阱示例詳解

    C/C++中關(guān)于std::string的compare陷阱示例詳解

    這篇文章主要給大家介紹了關(guān)于C/C++中關(guān)于std::string的compare陷阱的相關(guān)資料,文中先對(duì)C/C++中的std::string進(jìn)行了簡(jiǎn)單的介紹,通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 解析Linux內(nèi)核的基本的模塊管理與時(shí)間管理操作

    解析Linux內(nèi)核的基本的模塊管理與時(shí)間管理操作

    這篇文章主要介紹了Linux內(nèi)核的基本的模塊管理與時(shí)間管理操作,包括模塊加載卸載函數(shù)的使用和定時(shí)器的用法等知識(shí),需要的朋友可以參考下
    2016-02-02
  • C++條件語(yǔ)句和條件運(yùn)算符的使用方法講解

    C++條件語(yǔ)句和條件運(yùn)算符的使用方法講解

    這篇文章主要介紹了C++條件語(yǔ)句和條件運(yùn)算符的使用方法講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 一文總結(jié)C++運(yùn)算符的使用方法

    一文總結(jié)C++運(yùn)算符的使用方法

    這篇文章主要為大家詳細(xì)總結(jié)了C++中運(yùn)算符的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • 深入理解Qt信號(hào)槽機(jī)制

    深入理解Qt信號(hào)槽機(jī)制

    信號(hào)槽是 Qt 框架引以為豪的機(jī)制之一。本文主要介紹了Qt信號(hào)槽機(jī)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++代碼實(shí)現(xiàn)雙向鏈表

    C++代碼實(shí)現(xiàn)雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了C++代碼實(shí)現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論