免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

<一>關(guān)于進程虛擬地址空間區(qū)域內(nèi)存劃分和布局

C++代碼在編譯完成后會生產(chǎn).exe程序(windows平臺), .EXE以文件的形式存儲在磁盤上 , 當運行.exe程序的時候操作系統(tǒng)會將磁盤上的.exe文件加載到內(nèi)存中,那么在加載到內(nèi)存中的時候,操作系統(tǒng)是如何在內(nèi)存中存放這個exe程序的?有沒有區(qū)域的劃分?那么是如何劃分的?首先需要了解一點,程序加載到內(nèi)存中,是不能直接加載到物理內(nèi)存中的
現(xiàn)在我們以 X86平臺的Linux 環(huán)境舉例當我們一個程序(進程)在啟動執(zhí)行時,操作系統(tǒng)會為其分配一個4G(2的32次方)的內(nèi)存空間(就是進程的虛擬內(nèi)存地址空間)
如下圖內(nèi)存分配圖

<一>關(guān)于進程虛擬地址空間區(qū)域內(nèi)存劃分和布局

文章插圖
點擊查看代碼#incclude <iostrea>using namespace std;int gdata1=1;int gdata2=0;int gdata3;static int gdata4=10;static int gdata5=0;static int gdata6;int main(){ int a=100; int b=0; int c; staticint d=1000; staticint e=0; staticint f; return 0;}
如上面代碼中的全局變量gdata1,gdata2,gdata3,gdata4,gdata5,gdata6無論是普通的還是靜態(tài)的,他們都叫"數(shù)據(jù)",每一個數(shù)據(jù)在編譯后,在符號表中都會產(chǎn)生符號.gdata1和gdata4 初始化了的 , 而且值部不為0,所以存儲在.data段gdata2和gdata5 初始化了,但是值為0,所以存儲在.bss段gdata3和gdata6 未初始化 , 存儲在.bss段
main 函數(shù)中的 a,b,c 不是數(shù)據(jù),不會在符號表中產(chǎn)生符號,他們編譯只產(chǎn)生指令例如:move dword prt[a], och  , 他們是存儲在.text段,當程序運行到這里時,他們是在棧上分配空間的
對于靜態(tài)的局部變量 如 d,e,f 也是數(shù)據(jù),存放在數(shù)據(jù)段,也會在符號表中產(chǎn)生符號,程序啟動的時候不會初始化,而是在第一次運行到的時候才會初始化, d存儲在.data段,e,f存儲在.bss段
打印C的值,是一個棧上的隨機值 , 打印f,由于存儲在.bss段,系統(tǒng)會負責為.bss段做初始化,置0,所以打印出來f為0
&lt;一&gt;關(guān)于進程虛擬地址空間區(qū)域內(nèi)存劃分和布局

文章插圖
上面紅框部分存儲在代碼段 , 藍色框部分存儲在數(shù)據(jù)段
注意:不同的進程之間,用戶空間是私有的,內(nèi)核空間是共享的
【<一>關(guān)于進程虛擬地址空間區(qū)域內(nèi)存劃分和布局】

    經(jīng)驗總結(jié)擴展閱讀