教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

C++代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)的詳細(xì)介紹 [C++培訓(xùn)]

更新時(shí)間:2020年03月31日17時(shí)08分 來源:傳智播客 瀏覽次數(shù):

C++內(nèi)存四區(qū)是哪四區(qū)?C++內(nèi)存四區(qū)分為代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū),下面我們分別介紹詳細(xì)介紹。

1、代碼區(qū)

存放 CPU 執(zhí)行的機(jī)器指令。通常代碼區(qū)是可共享的(即另外的執(zhí)行程序可以調(diào)用它),使其可共享的目的是對于頻繁被執(zhí)行的程序,只需要在內(nèi)存中有一份代碼即可。代碼區(qū)通常是只讀的,使其只讀的原因是防止程序意外地修改了它的指令。另外,代碼區(qū)還規(guī)劃了局部變量的相關(guān)信息。推薦了解傳智播客C++工程師培訓(xùn)課程。

總結(jié):你所寫的所有代碼都會(huì)放入到代碼區(qū)中,代碼區(qū)的特點(diǎn)是共享和只讀。

2、全局區(qū)

全局區(qū)中主要存放的數(shù)據(jù)有:全局變量、靜態(tài)變量、常量(如字符串常量)

全局區(qū)的叫法有很多:全局區(qū)、靜態(tài)區(qū)、數(shù)據(jù)區(qū)、全局靜態(tài)區(qū)、靜態(tài)全局區(qū)

這部分可以細(xì)分為data區(qū)和bss區(qū)

2.1、data區(qū)

data區(qū)里主要存放的是已經(jīng)初始化的全局變量、靜態(tài)變量和常量

2.2、bss區(qū)

bss區(qū)主要存放的是未初始化的全局變量、靜態(tài)變量,這些未初始化的數(shù)據(jù)在程序執(zhí)行前會(huì)自動(dòng)被系統(tǒng)初始化為0或者NULL

2.3、常量區(qū)

常量區(qū)是全局區(qū)中劃分的一個(gè)小區(qū)域,里面存放的是常量,如const修飾的全局變量、字符串常量等

在VS下運(yùn)行結(jié)果如下:

1585619543609_C++內(nèi)存四個(gè)4.jpg

1585619977313_C++內(nèi)存四個(gè)區(qū)1.jpg

1585619987692_C++內(nèi)存四個(gè)區(qū)1.1.jpg

總結(jié):全局區(qū)存放的是全局變量、靜態(tài)變量和常量

在程序運(yùn)行后由產(chǎn)生了兩個(gè)區(qū)域,棧區(qū)和堆區(qū)

3、棧區(qū)(stack)

棧是一種先進(jìn)后出的內(nèi)存結(jié)構(gòu),由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值、返回值、局部變量等。在程序運(yùn)行過程中實(shí)時(shí)加載和釋放,因此,局部變量的生存周期為申請到釋放該段棧空間。

vs運(yùn)行效果如下

1585620081849_C++內(nèi)存四個(gè)區(qū)3.jpg

1585620094607_C++內(nèi)存四個(gè)區(qū)4.jpg


4、堆區(qū)(heap)

堆是一個(gè)大容器,它的容量要遠(yuǎn)遠(yuǎn)大于棧,但沒有棧那樣先進(jìn)后出的順序。用于動(dòng)態(tài)內(nèi)存分配。堆在內(nèi)存中位于BSS區(qū)和棧區(qū)之間。一般由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)由操作系統(tǒng)回收。

vs運(yùn)行效果如下:

1585620109961_C++內(nèi)存四個(gè)區(qū)5.jpg

1585620119902_C++內(nèi)存四個(gè)區(qū)6.jpg


當(dāng)我們把幾個(gè)案例放在一起執(zhí)行,就可以看到內(nèi)存將每個(gè)區(qū)域劃分的很有條理。每個(gè)區(qū)域互不干涉,區(qū)域中的數(shù)據(jù)地址也是非常接近的。

1585620130010_C++內(nèi)存四個(gè)區(qū)7.jpg


猜你喜歡
C++學(xué)科之零基礎(chǔ)視頻教程

0 分享到:
和我們在線交談!