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

C++程序的五大內(nèi)存分區(qū)實例詳解

 更新時間:2021年10月26日 09:47:41   作者:IT老張  
C++內(nèi)存區(qū)域,一般可分為棧內(nèi)存區(qū)、堆內(nèi)存區(qū)、全局/靜態(tài)內(nèi)存區(qū)、文字常量內(nèi)存區(qū)及程序代碼區(qū)5大分區(qū),本文就帶大家深刻的理解這5大內(nèi)存分區(qū),感興趣的可以了解一下

C++程序在運行時所占用的內(nèi)存區(qū)域,一般可分為棧內(nèi)存區(qū)、堆內(nèi)存區(qū)、全局/靜態(tài)內(nèi)存區(qū)、文字常量內(nèi)存區(qū)及程序代碼區(qū)5大分區(qū):

下面使用日常開發(fā)中的編程實例,詳細介紹一下這5個分區(qū),以便大家能更深刻的理解這5大內(nèi)存分區(qū)。

1、棧內(nèi)存區(qū)

       棧內(nèi)存區(qū)是我們用的最多的分區(qū),只要有函數(shù)的地方都會使用到這個分區(qū)。棧分區(qū)是用來存放函數(shù)參數(shù)及函數(shù)局部變量值的內(nèi)存區(qū),是由編譯器在編譯時自動分配和釋放的。

       函數(shù)中的參數(shù)與函數(shù)中的局部變量占用的內(nèi)存是代碼執(zhí)行到函數(shù)(進入函數(shù))是分配的,在離開時函數(shù)時這些內(nèi)存會自動被釋放。下面從下面幾個簡單的實例來更進一步地認(rèn)識棧內(nèi)存。

1.1、調(diào)用函數(shù)時通過棧來傳遞函數(shù)的參數(shù)值       

       調(diào)用函數(shù)時時通過棧傳遞參數(shù)值的,即在調(diào)用函數(shù)之前要將函數(shù)的參數(shù)值依次壓入到棧上,然后再去call被調(diào)用函數(shù)的。這點從匯編代碼上可以清晰地看出來。比如下面一段簡單的實現(xiàn)兩數(shù)相加的代碼:

// 被調(diào)用函數(shù)
int AddNum(int a, int b)
{
    int nSum = a + b;
    return nSum;
}
 
 
// 調(diào)用內(nèi)調(diào)用函數(shù)的實例代碼
int a = 7;
int b = 8;
 
int  nSum = AddNum(a, b);

       可以在VS中查看上述C++代碼對應(yīng)的匯編代碼。具體的做法是,將上述代碼拷貝到VS中,啟動VS調(diào)試,在鼠標(biāo)右鍵單擊顯示的右鍵菜單中點擊“轉(zhuǎn)到反匯編”區(qū)查看C++代碼對應(yīng)的匯編代碼:

從上述匯編代碼可以看出,在調(diào)用AddNum函數(shù)之前,將要傳入的參數(shù)a和參數(shù)b的值先壓到棧上,然后再去call AddNum函數(shù)。作為被調(diào)函數(shù)的AddNum會從棧上讀取傳入的參數(shù)內(nèi)容。

1.2、線程占用的棧內(nèi)存是有上限的

       線程占用的棧內(nèi)存是有上限的,可以在創(chuàng)建線程時指定??臻g的大小。在Windows上,線程默認(rèn)的棧空間是1MB。線程在某一時刻的函數(shù)調(diào)用堆棧中的所有函數(shù)占用的棧空間總和,就是當(dāng)前時刻的線程占用的棧內(nèi)存。

       進入函數(shù)時會將該函數(shù)的??臻g累計到所在線程的??臻g占用內(nèi)存數(shù)上(函數(shù)內(nèi)部申請存放局部變量的棧空間),離開函數(shù)則會釋放它占用的??臻g,就會將所在線程占用的棧內(nèi)存數(shù)上減掉函該函數(shù)占用的空間。如果當(dāng)前線程占用的??臻g大于線程的上限時(一般是在進入一個函數(shù)時觸發(fā)),則會報出“stack overflow”的棧溢出異常:

程序會發(fā)生崩潰。

       這里有一點需要說明一下,在某個函數(shù)中使用了switch...case語句,語句中包含了多個case分支,在這些分支中定義了一些局部變量,雖然這些局部變量的生命周期只位于case子句中,但是都是直接算在所在函數(shù)的??臻g上的,是剛執(zhí)行進函數(shù)就分配好了,即便當(dāng)前還沒運行到對應(yīng)的case子句中,即便這些case子句的局部變量的生命周期僅在case子句內(nèi)!

2、堆內(nèi)存區(qū)

       堆內(nèi)存也是我們最常用的內(nèi)存區(qū),因為每個線程的棧內(nèi)存是有限的,我們一般將大部分?jǐn)?shù)據(jù)要放置在堆內(nèi)存中。

       在C++中,malloc/new申請的內(nèi)存都是從堆內(nèi)存上分配的,用完后由free/delete區(qū)釋放的。如果沒有釋放堆內(nèi)存,則程序結(jié)束時由操作系統(tǒng)統(tǒng)一回收。

       堆內(nèi)存的管理比棧內(nèi)存要復(fù)雜的多,如果是堆內(nèi)存異常導(dǎo)致的崩潰,比棧內(nèi)存異常(比如內(nèi)存越界引起內(nèi)存訪問為例)導(dǎo)致的崩潰,要難查的多。

       如果malloc/new來的內(nèi)存在用完后沒有釋放,則會導(dǎo)致內(nèi)存泄露,如果頻繁執(zhí)行的代碼中有內(nèi)存泄露則是致命的,因為隨著程序的運行時間的加長,會產(chǎn)生越來越多的內(nèi)存泄露,如果將所屬進程虛擬內(nèi)存耗盡,會產(chǎn)生“Out of memory”的異常:

 程序直接閃退崩潰。

3、全局/靜態(tài)內(nèi)存區(qū)

        全局變量和靜態(tài)變量的內(nèi)存就是在該區(qū)上分配的,全局變量和靜態(tài)變量的生命周期也是一樣的,都是在程序啟動時分配內(nèi)存的,在程序退出時釋放內(nèi)存的。

       全局變量一般會使用extern關(guān)鍵字來聲明,比如:

extern int m_nClientId;

而靜態(tài)變量則是使用static關(guān)鍵字來聲明:

static int nCount;

       全局變量和靜態(tài)變量都要求在定義的時候要初始化,注意此處講的定義是和聲明是相對應(yīng)的概念。全局變量和靜態(tài)變量的區(qū)別在于,全局變量的作用域更廣,整個模塊中都能使用。靜態(tài)變量則因其定義的位置不同有不同的作用域。

        可以在函數(shù)中定義靜態(tài)變量,也可以在類中定義靜態(tài)成員變量。函數(shù)中定義的靜態(tài)變量只能在函數(shù)中被訪問,類中定義的靜態(tài)變量則可以在類外部使用“類名::靜態(tài)成員變量名”去訪問。

4、文字常量區(qū)

        該分區(qū)是用來存放常量值,如常量字符串等,比如如下的字符串常量:(將字符串常量的地址賦值給指針p):

char* p = ”this is a test.”;

該字符串占用的內(nèi)存地址就是文字常量區(qū)內(nèi)存上的。

       該部分內(nèi)存中的內(nèi)容是固定的常量,是不允許修改的,程序結(jié)束后由操作系統(tǒng)統(tǒng)一回收。這部分內(nèi)容比較簡單,沒什么要講的。

5、程序代碼區(qū)

       前面說的內(nèi)存都是數(shù)據(jù)段的內(nèi)存,是用來存放程序運行中的各種數(shù)據(jù)的;該部分的內(nèi)存是代碼段的內(nèi)存,是用來存放程序二進制代碼的。
      數(shù)據(jù)段的內(nèi)存地址和代碼段指令的地址,完全是兩個概念,不能混為一談。比如某個變量的內(nèi)存地址是數(shù)據(jù)段的地址:

某條匯編指令的地址,則是代碼段的地址:

是兩個完全不搭嘎的地址,一定要區(qū)分開來。

到此這篇關(guān)于C++程序的五大內(nèi)存分區(qū)實例詳解的文章就介紹到這了,更多相關(guān)C++ 五大內(nèi)存分區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux vmstat命令實戰(zhàn)詳細解析

    Linux vmstat命令實戰(zhàn)詳細解析

    這個命令是我查看Linux/Unix最喜愛的命令,一個是Linux/Unix都支持,二是相比top,我可以看到整個機器的CPU,內(nèi)存,IO的使用情況,而不是單單看到各個進程的CPU使用率和內(nèi)存使用率(使用場景不一樣)
    2013-09-09
  • 用Visual Studio2017寫C++靜態(tài)庫圖文詳解

    用Visual Studio2017寫C++靜態(tài)庫圖文詳解

    這篇文章主要介紹了用Visual Studio2017寫C++靜態(tài)庫的圖文教程,需要的朋友可以參考下
    2017-04-04
  • C++多線程實現(xiàn)電子詞典

    C++多線程實現(xiàn)電子詞典

    這篇文章主要為大家詳細介紹了C++多線程實現(xiàn)電子詞典,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 一文帶你搞懂C語言預(yù)處理宏定義

    一文帶你搞懂C語言預(yù)處理宏定義

    這篇文章主要為大家詳細介紹了C語言預(yù)處理宏定義#define,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • 詳解C語言中return返回函數(shù)局部變量的問題

    詳解C語言中return返回函數(shù)局部變量的問題

    本文主要介紹了C語言中return返回函數(shù)局部變量的問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • OpenCV?直方圖均衡化的實現(xiàn)原理解析

    OpenCV?直方圖均衡化的實現(xiàn)原理解析

    直方圖均衡化是通過拉伸像素強度分布范圍來增強圖像對比度的一種方法,今天通過本文給大家介紹OpenCV?直方圖均衡化的實現(xiàn)原理解析,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • QT使用QComBox和QLineEdit實現(xiàn)模糊查詢功能

    QT使用QComBox和QLineEdit實現(xiàn)模糊查詢功能

    模糊查詢是指根據(jù)用戶輸入的文本,在下拉框的選項中進行模糊匹配,并動態(tài)地顯示匹配的選項,本文將使用QComBox和QLineEdit實現(xiàn)模糊查詢功能,需要的可以參考下
    2023-11-11
  • C++如何比較兩個字符串或string是否相等strcmp()和compare()

    C++如何比較兩個字符串或string是否相等strcmp()和compare()

    這篇文章主要介紹了C++如何比較兩個字符串或string是否相等strcmp()和compare()問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • C++簡明講解類型轉(zhuǎn)換的使用與作用

    C++簡明講解類型轉(zhuǎn)換的使用與作用

    類型轉(zhuǎn)換(type?cast),是高級語言的一個基本語法。它被實現(xiàn)為一個特殊的運算符,以小括號內(nèi)加上類型名來表示,接下來讓我們一起來詳細了解
    2022-04-04
  • opencv實現(xiàn)機器視覺檢測和計數(shù)的方法

    opencv實現(xiàn)機器視覺檢測和計數(shù)的方法

    在機器視覺中,有時需要對產(chǎn)品進行檢測和計數(shù)。其難點無非是對于產(chǎn)品的圖像分割。本文就來介紹一下機器視覺檢測和計數(shù)的實現(xiàn),感興趣的可以參考一下
    2021-05-05

最新評論

黄平县| 遂昌县| 石棉县| 利川市| 平安县| 保定市| 清水河县| 宁陵县| 深圳市| 桂东县| 广东省| 新密市| 微山县| 大余县| 蚌埠市| 左权县| 昔阳县| 澄城县| 米脂县| 平舆县| 烟台市| 苏尼特右旗| 洞口县| 舟山市| 马公市| 大悟县| 景宁| 昌平区| 陵川县| 洞口县| 手机| 岳普湖县| 石楼县| 嘉义县| 遵义县| 柳河县| 鄯善县| 渝中区| 五莲县| 金阳县| 怀柔区|