青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

BSS段:BSS段(bss segment)通常是指用來存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域。BSS是英文Block Started by Symbol的簡(jiǎn)稱。BSS段屬于靜態(tài)內(nèi)存分配。

數(shù)據(jù)段:數(shù)據(jù)段(data segment)通常是指用來存放程序中已初始化的全局變量的一塊內(nèi)存區(qū)域。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配。

代碼段:代碼段(code segment/text segment)通常是指用來存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。這部分區(qū)域的大小在程序運(yùn)行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀, 某些架構(gòu)也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。

堆(heap):堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段,它的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。當(dāng)進(jìn)程調(diào)用malloc等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張);當(dāng)利用free等函數(shù)釋放內(nèi)存時(shí),被釋放的內(nèi)存從堆中被剔除(堆被縮減)

(stack):棧又稱堆棧, 是用戶存放程序臨時(shí)創(chuàng)建的局部變量,也就是說我們函數(shù)括弧“{}”中定義的變量(但不包括static聲明的變量,static意味著在數(shù)據(jù)段中存放變量)。除此以外,在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值也會(huì)被存放回棧中。由于棧的先進(jìn)先出特點(diǎn),所以棧特別方便用來保存/恢復(fù)調(diào)用現(xiàn)場(chǎng)。從這個(gè)意義上講,我們可以把堆棧看成一個(gè)寄存、交換臨時(shí)數(shù)據(jù)的內(nèi)存區(qū)。

【例一】

cl編譯兩個(gè)小程序如下:

程序1:

int ar[30000];
void main()
{
    ......
}


程序2:

int ar[300000] =  {1, 2, 3, 4, 5, 6 };
void main()
{
    ......
}


發(fā)現(xiàn)程序2編譯之后所得的.exe文件比程序1的要大得多。當(dāng)下甚為不解,于是手工編譯了一下,并使用了/FAs編譯選項(xiàng)來查看了一下其各自的.asm,發(fā)現(xiàn)在程序1.asmar的定義如下:

_BSS SEGMENT
     ?ar@@3PAHA DD 0493e0H DUP (?)    ; ar
_BSS ENDS


而在程序2.asm中,ar被定義為:

_DATA SEGMENT
     ?ar@@3PAHA DD 01H     ; ar
                DD 02H
                DD 03H
                ORG $+1199988
_DATA ENDS


區(qū)別很明顯,一個(gè)位于.bss段,而另一個(gè)位于.data段,兩者的區(qū)別在于:全局的未初始化變量存在于.bss段中,具體體現(xiàn)為一個(gè)占位符;全局的已初始化變量存于.data段中;而函數(shù)內(nèi)的自動(dòng)變量都在棧上分配空間。.bss是不占用.exe文件空間的,其內(nèi)容由操作系統(tǒng)初始化(清零);而.data卻需要占用,其內(nèi)容由程序初始化,因此造成了上述情況。

【例二】

編譯如下程序(test.cpp:
#include <stdio.h>

#define LEN 1002000

int inbss[LEN];
float fA;
int indata[LEN]={1,2,3,4,5,6,7,8,9};
double dbB = 100.0;

const int cst = 100;

int main(void)
{
    int run[100] = {1,2,3,4,5,6,7,8,9};
    for(int i=0; i<LEN; ++i)
        printf("%d ", inbss[i]);
    return 0;
}

命令:cl /FA  test.cpp 回車 (/FA:產(chǎn)生匯編代碼)
產(chǎn)生的匯編代碼(test.asm):
    TITLE    test.cpp
    .386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT    SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT    ENDS
_DATA    SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA    ENDS
CONST    SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST    ENDS
_BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS    ENDS
_TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS    ENDS
FLAT    GROUP _DATA, CONST, _BSS
    ASSUME    CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC    ?inbss@@3PAHA                    ; inbss
PUBLIC    ?fA@@3MA                    ; fA
PUBLIC    ?indata@@3PAHA                    ; indata
PUBLIC    ?dbB@@3NA                    ; dbB
_BSS    SEGMENT
?
inbss@@3PAHA DD 0f4a10H DUP (?)            ; inbss
?fA@@3MA DD    01H DUP (?)                ; fA
_BSS    ENDS
_DATA    SEGMENT
?
indata@@3PAHA DD 01H                    ; indata
    DD    02H
    DD    03H
    DD    04H
    DD    05H
    DD    06H
    DD    07H
    DD    08H
    DD    09H
    ORG $+4007964
?dbB@@3NA DQ    04059000000000000r        ; 100    ; dbB
_DATA    ENDS
PUBLIC    _main
EXTRN    _printf:NEAR
_DATA    SEGMENT
$SG537    DB    '%d ', 00H
_DATA    ENDS
_TEXT    SEGMENT
_run$ = -400
_i$ = -404
_main    PROC NEAR
; File test.cpp
; Line 13
    push    ebp
    mov    ebp, esp
    sub    esp, 404                ; 00000194H
    push    edi
; Line 14
    mov    DWORD PTR _run$[ebp], 1
    mov    DWORD PTR _run$[ebp+4], 2
    mov    DWORD PTR _run$[ebp+8], 3
    mov    DWORD PTR _run$[ebp+12], 4
    mov    DWORD PTR _run$[ebp+16], 5
    mov    DWORD PTR _run$[ebp+20], 6
    mov    DWORD PTR _run$[ebp+24], 7
    mov    DWORD PTR _run$[ebp+28], 8
    mov    DWORD PTR _run$[ebp+32], 9
    mov    ecx, 91                    ; 0000005bH
    xor    eax, eax
    lea    edi, DWORD PTR _run$[ebp+36]
    rep stosd
; Line 15
    mov    DWORD PTR _i$[ebp], 0
    jmp    SHORT $L534
$L535:
    mov    eax, DWORD PTR _i$[ebp]
    add    eax, 1
    mov    DWORD PTR _i$[ebp], eax
$L534:
    cmp    DWORD PTR _i$[ebp], 1002000        ; 000f4a10H
    jge    SHORT $L536
; Line 16
    mov    ecx, DWORD PTR _i$[ebp]
    mov    edx, DWORD PTR ?inbss@@3PAHA[ecx*4]
    push    edx
    push    OFFSET FLAT:$SG537
    call    _printf
    add    esp, 8
    jmp    SHORT $L535
$L536:
; Line 17
    xor    eax, eax
; Line 18
    pop    edi
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS
END
 
----------------------------------------
通過匯編文件可以看到,數(shù)組inbssindata位于不同的段(inbss位于bss段,而indata位于data段)
若把test.cpp中的indata數(shù)組拿掉,查看生成的exe文件的大小,可以發(fā)現(xiàn),indata拿掉之后exe文件的大小小了很多。而若拿掉的是inbss數(shù)組,exe文件大小跟沒拿掉時(shí)相差無幾。

說明了:
bss
段(未手動(dòng)初始化的數(shù)據(jù))并不給該段的數(shù)據(jù)分配空間,只是記錄數(shù)據(jù)所需空間的大小。
data(已手動(dòng)初始化的數(shù)據(jù))段則為數(shù)據(jù)分配空間,數(shù)據(jù)保存在目標(biāo)文件中。

數(shù)據(jù)段包含經(jīng)過初始化的全局變量以及它們的值。BSS段的大小從可執(zhí)行文件中得到 ,然后鏈接器得到這個(gè)大小的內(nèi)存塊,緊跟在數(shù)據(jù)段后面。當(dāng)這個(gè)內(nèi)存區(qū)進(jìn)入程序的地址空間后全部清零。包含數(shù)據(jù)段和BSS段的整個(gè)區(qū)段此時(shí)通常稱為數(shù)據(jù)區(qū)。

Feedback

# re: BSS段、數(shù)據(jù)段、代碼段、堆與棧   回復(fù)  更多評(píng)論   

2014-09-29 09:45 by winnie.chx
整理和不錯(cuò),不過棧是先進(jìn)后出吧,寫錯(cuò)了吧
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            噜噜噜91成人网| 亚洲精品一区二区三区福利| 久久久综合激的五月天| 亚洲高清123| 国产亚洲a∨片在线观看| 激情成人av在线| 亚洲永久精品大片| 亚洲韩国日本中文字幕| 午夜精品在线| 国产精品成人v| 一区二区三区欧美| 欧美好骚综合网| 久久久999精品免费| 国产一区二区| 久久久久五月天| 香蕉成人伊视频在线观看| 欧美色图五月天| 一区二区三区国产盗摄| 欧美激情精品久久久久久蜜臀| 欧美与欧洲交xxxx免费观看| 国产精品日日摸夜夜添夜夜av| 一区二区三区免费看| 亚洲国产视频直播| 欧美精品高清视频| 一区二区欧美日韩| 亚洲日本中文字幕区| 欧美激情免费观看| 一区二区三区黄色| 在线中文字幕不卡| 国产精品免费看片| 欧美一区二区三区另类| 午夜国产精品视频免费体验区| 国产欧美日韩精品专区| 久久久久国产精品一区三寸 | 欧美高清视频www夜色资源网| 亚洲国产合集| 亚洲国产日韩综合一区| 欧美日韩直播| 欧美一区二区三区免费视| 香蕉久久国产| 亚洲国产三级在线| 亚洲精品视频在线观看免费| 国产精品久久久久久福利一牛影视| 亚洲男人影院| 久久高清福利视频| 亚洲精品欧美专区| 亚洲视频axxx| 亚洲高清资源| 9人人澡人人爽人人精品| 免费的成人av| 欧美人与性禽动交情品| 性色av一区二区怡红| 久久精品色图| aa级大片欧美三级| 性色av一区二区三区| 在线精品视频免费观看| 99精品视频免费观看视频| 99pao成人国产永久免费视频| 欧美人与禽性xxxxx杂性| 性色av香蕉一区二区| 久久久一区二区三区| 一本大道久久a久久精二百| 亚洲一区尤物| 亚洲精品日韩久久| 久久久之久亚州精品露出| 欧美日本在线播放| 久久亚洲国产成人| 欧美日韩综合精品| 美女任你摸久久| 国产精品免费在线| 亚洲激情黄色| 国产综合久久久久影院| av不卡在线观看| 亚洲国产精品一区二区尤物区 | 亚洲高清在线视频| 国产亚洲a∨片在线观看| 亚洲精品自在久久| 亚洲国产91精品在线观看| 午夜一区二区三区在线观看| 亚洲视频第一页| 免费美女久久99| 美乳少妇欧美精品| 国产亚洲激情| 亚洲欧美成人精品| 亚洲欧美一区在线| 欧美日韩一区二区三区视频| 亚洲第一搞黄网站| 亚洲国产精品悠悠久久琪琪| 久久国产精品久久国产精品 | 亚洲国产日韩欧美在线动漫| 狠狠色噜噜狠狠色综合久| 午夜精品久久久久久久男人的天堂| 久久精品国语| 性做久久久久久免费观看欧美| 欧美日韩国产美女| 亚洲国产精品电影在线观看| 亚洲黄一区二区三区| 久久亚洲国产精品日日av夜夜| 久久久久久网址| 国内成人精品2018免费看| 欧美一区1区三区3区公司| 久久成人免费日本黄色| 国产亚洲精品久久久久婷婷瑜伽| 香港久久久电影| 久久伊人亚洲| 亚洲电影自拍| 欧美成在线视频| 亚洲国产精品一区二区第四页av| 亚洲国产黄色| 欧美精品色一区二区三区| 亚洲精品久久| 一本久久综合亚洲鲁鲁| 欧美日韩免费一区二区三区| 日韩亚洲欧美在线观看| 亚洲一区二区成人| 欧美在线播放一区| 久久人91精品久久久久久不卡| 国产日韩欧美精品| 久久精品123| 亚洲美女尤物影院| 国产性做久久久久久| 亚洲国产精品123| 亚洲毛片播放| 国产精品久久久久91| 久久国产精品72免费观看| 亚洲午夜在线视频| 亚洲网站在线播放| 久久黄色小说| 亚洲电影在线免费观看| 另类专区欧美制服同性| 久热re这里精品视频在线6| 欧美激情1区2区| 亚洲伦理中文字幕| 一区二区在线视频播放| 国产在线不卡视频| 欧美日韩成人综合在线一区二区| 欧美精品免费在线| 国产欧美一区二区三区在线老狼| 国产精品二区在线| 欧美视频一区二区三区| 尤物在线精品| 久久久久久久一区二区三区| 国产偷久久久精品专区| 欧美三日本三级少妇三99| 亚洲午夜一区| 欧美日韩综合久久| 亚洲理论在线观看| 美女亚洲精品| 亚洲深夜福利网站| 久久久精彩视频| 夜夜嗨av一区二区三区网站四季av | 国产精品久久久久久福利一牛影视| 亚洲一区二区在线免费观看视频 | 亚洲国产欧美在线| 亚洲欧美制服另类日韩| 亚洲第一页自拍| 欧美精品成人一区二区在线观看 | 狠狠狠色丁香婷婷综合激情| 欧美日韩午夜精品| 欧美一区亚洲二区| 亚洲视频福利| 欧美韩国日本一区| 美女免费视频一区| 香蕉视频成人在线观看 | 久久精品视频在线| 亚洲精品中文字幕在线| 国产视频综合在线| 欧美激情一区二区三区在线视频| 久久爱另类一区二区小说| 亚洲欧洲在线一区| 美日韩免费视频| 欧美一区亚洲一区| 午夜激情一区| 一区二区三区**美女毛片| 亚洲精品在线视频| 亚洲国产精品第一区二区| 免费久久99精品国产自| 久久综合伊人77777尤物| 香蕉久久久久久久av网站| 亚洲一区观看| 一本到12不卡视频在线dvd| 日韩一级黄色av| 国产精品免费区二区三区观看| 国产精品成人免费| 欧美三级不卡| 欧美日本国产| 欧美理论电影网| 欧美激情亚洲自拍| 欧美成人福利视频| 久久综合色影院| 欧美1区3d| 亚洲美女福利视频网站| 欧美激情视频在线播放 | 欧美午夜片在线观看| 欧美日韩一级黄| 国产精品丝袜白浆摸在线| 国产精品mv在线观看| 国产精品网站一区| 国产精品国产自产拍高清av王其| 国产精品久久久久久久久借妻|