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

Prayer

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

BSS段、數據段、代碼段、堆與棧

Posted on 2009-08-17 13:46 Prayer 閱讀(27752) 評論(1)  編輯 收藏 引用 所屬分類: C/C++LINUX/UNIX/AIX

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

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

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

堆(heap):堆是用于存放進程運行中被動態分配的內存段,它的大小并不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)

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

【例一】

cl編譯兩個小程序如下:

程序1:

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


程序2:

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


發現程序2編譯之后所得的.exe文件比程序1的要大得多。當下甚為不解,于是手工編譯了一下,并使用了/FAs編譯選項來查看了一下其各自的.asm,發現在程序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


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

【例二】

編譯如下程序(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:產生匯編代碼)
產生的匯編代碼(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
 
----------------------------------------
通過匯編文件可以看到,數組inbssindata位于不同的段(inbss位于bss段,而indata位于data段)
若把test.cpp中的indata數組拿掉,查看生成的exe文件的大小,可以發現,indata拿掉之后exe文件的大小小了很多。而若拿掉的是inbss數組,exe文件大小跟沒拿掉時相差無幾。

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

數據段包含經過初始化的全局變量以及它們的值。BSS段的大小從可執行文件中得到 ,然后鏈接器得到這個大小的內存塊,緊跟在數據段后面。當這個內存區進入程序的地址空間后全部清零。包含數據段和BSS段的整個區段此時通常稱為數據區。

Feedback

# re: BSS段、數據段、代碼段、堆與棧   回復  更多評論   

2014-09-29 09:45 by winnie.chx
整理和不錯,不過棧是先進后出吧,寫錯了吧
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区欧美一区| 久久视频这里只有精品| 国产精品伦子伦免费视频| 欧美精品三区| 欧美日韩精品| 国产精品igao视频网网址不卡日韩| 欧美经典一区二区三区| 久久精品亚洲热| 久久久www成人免费毛片麻豆| 性视频1819p久久| 久久精品夜色噜噜亚洲aⅴ| 久久久久中文| 欧美黄色aaaa| 一区二区日韩| 久久久久se| 欧美久久成人| 国产欧美日本一区视频| 黄色成人在线免费| 99香蕉国产精品偷在线观看| 亚洲欧美国产精品专区久久| 久久人91精品久久久久久不卡 | 欧美美女喷水视频| 国产精品视频自拍| 在线欧美日韩国产| 一区二区三区回区在观看免费视频 | 欧美11—12娇小xxxx| 欧美日本亚洲韩国国产| 国产一区二区三区在线播放免费观看 | 在线午夜精品自拍| 欧美中文字幕精品| 欧美精品三级日韩久久| 国产一区二区在线观看免费播放| 亚洲激情电影在线| 欧美影院在线| 亚洲每日在线| 免费观看欧美在线视频的网站| 国产精品久久久久99| 亚洲经典一区| 久久精品在线播放| 亚洲一区二区伦理| 欧美精品黄色| 亚洲人久久久| 久久综合精品一区| 亚洲在线日韩| 欧美日韩免费精品| 亚洲巨乳在线| 欧美国产日韩a欧美在线观看| 亚洲在线黄色| 国产精品欧美经典| 在线亚洲免费| 99国产一区| 欧美日韩精品免费观看视一区二区| 国产一区二区三区四区| 欧美一区二区三区免费视| 亚洲美女黄色片| 欧美精品 日韩| 亚洲网站视频福利| 久久久午夜视频| 欧美视频一区二区三区在线观看| 国产综合一区二区| 亚洲欧美日韩国产另类专区| 亚洲激精日韩激精欧美精品| 欧美一级片一区| 国产精品久久久久影院亚瑟| 在线亚洲免费视频| 亚洲精品小视频在线观看| 久久亚洲电影| 亚洲国产高清在线| 免费在线观看精品| 久久精品天堂| 亚洲大胆在线| 欧美成人资源| 欧美国产1区2区| 亚洲精选在线| 亚洲美女毛片| 国产精品视频观看| 久久九九久精品国产免费直播| 欧美亚洲一区在线| 一区二区三区亚洲| 最新国产精品拍自在线播放| 欧美日本国产一区| 亚洲自拍高清| 欧美一区二区三区在| 伊人男人综合视频网| 亚洲高清免费视频| 国产精品久久久久久久久动漫| 久久国产精品99国产| 老司机午夜精品视频在线观看| 亚洲精品极品| 一区二区三区 在线观看视频| 国产精品综合网站| 免费视频亚洲| 国产精品成人免费视频| 久久精品网址| 欧美激情第3页| 欧美亚洲在线播放| 久久综合狠狠综合久久综合88| 在线视频亚洲欧美| 久久免费少妇高潮久久精品99| 99re8这里有精品热视频免费| 中国成人黄色视屏| 亚洲国产cao| 一本色道久久综合亚洲91| 国产视频亚洲精品| 亚洲品质自拍| 国产在线精品自拍| 99精品国产在热久久| 在线播放亚洲| 一本一本久久a久久精品综合妖精| 狠狠88综合久久久久综合网| 亚洲蜜桃精久久久久久久| 国产一区二区按摩在线观看| 亚洲乱码视频| 91久久精品国产91久久| 欧美一区二区三区视频在线| 在线亚洲欧美专区二区| 久久午夜电影| 久久国产精品免费一区| 久久精品99| 亚洲精品免费一区二区三区| 99re热精品| 樱花yy私人影院亚洲| 亚洲图片在线观看| 亚洲美女精品久久| 久久亚洲国产成人| 欧美在线免费观看视频| 欧美日韩高清在线| 欧美黄色小视频| 狠狠做深爱婷婷久久综合一区| 99国产精品久久久| aa国产精品| 欧美日韩国产丝袜另类| 亚洲激情视频| 亚洲精品专区| 奶水喷射视频一区| 欧美成人免费全部| 1000精品久久久久久久久| 欧美一区二区在线免费观看| 久久成人18免费观看| 国产欧美一区二区三区国产幕精品| 一区二区三区欧美日韩| 亚洲天堂av综合网| 欧美日韩一区二区在线| 日韩午夜电影在线观看| 亚洲网站在线播放| 国产精品久久久久av免费| 中文无字幕一区二区三区| 亚洲欧美日韩另类| 国产精品一区久久| 久久99在线观看| 欧美韩日高清| 一本久久综合| 国产精品美女在线| 久久精品国产一区二区三区| 欧美成人中文字幕在线| 亚洲精品视频中文字幕| 欧美wwwwww| 中文国产亚洲喷潮| 亚洲欧美日韩另类精品一区二区三区| 国产精品都在这里| 性亚洲最疯狂xxxx高清| 免费久久99精品国产自在现线| 亚洲高清视频一区| 欧美日韩午夜精品| 午夜精品美女自拍福到在线| 狂野欧美性猛交xxxx巴西| 亚洲全黄一级网站| 国产精品久久久久高潮| 久久九九久精品国产免费直播| 欧美福利视频在线| 亚洲在线一区| 在线播放一区| 国产精品www.| 久久亚洲高清| 国产精品99久久久久久www| 久久精品二区| 一区二区三区四区五区视频| 黑人巨大精品欧美一区二区小视频| 欧美.www| 欧美影视一区| 亚洲美女中文字幕| 欧美成人一区二区三区在线观看 | 欧美日韩色综合| 一二三区精品| 免费看成人av| 翔田千里一区二区| 亚洲大片在线| 国产欧美午夜| 欧美日韩高清在线| 久久先锋资源| 欧美伊人久久| 亚洲天堂成人在线观看| 欧美国产日韩在线| 久久激情网站| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲精选久久| 亚洲国产99| 尤妮丝一区二区裸体视频| 国产精品狼人久久影院观看方式|