C語言的代碼記憶體布局具體解釋

來源:互聯網
上載者:User

標籤:標準   應該   記憶體地區   tar   意義   new   stat   堆棧   div   

一個程式本質上都是由 BSS 段、data段、text段三個組成的。這種概念在當前的電腦程式設計中是非常重要的一個基本概念,並且在嵌入式系統的設計中也非常重要,牽涉到嵌入式系統執行時的記憶體大小分配,儲存單元佔用空間大小的問題。

  • BSS段:在採用段式記憶體管理的架構中。BSS段(bss segment)一般是指用來存放程式中未初始化的全域變數的一塊記憶體地區。

    BSS是英文Block Started by Symbol的簡稱。

    BSS段屬於靜態記憶體配置。

  • 資料區段:在採用段式記憶體管理的架構中,資料區段(data segment)一般是指用來存放程式中已初始化的全域變數的一塊記憶體地區。資料區段屬於靜態記憶體配置。
  • 程式碼片段:在採用段式記憶體管理的架構中,程式碼片段(text segment)一般是指用來存放程式執行代碼的一塊記憶體地區。這部分地區的大小在程式執行前就已經確定,而且記憶體地區屬於僅僅讀。

    在程式碼片段中。也有可能包括一些僅僅讀的常數變數,比如字串常量等。

程式編譯後產生的目標檔案至少含有這三個段。這三個段的大致結構圖例如以下所看到的:

當中.text即為程式碼片段,為僅僅讀。.bss段包括程式中未初始化的全域變數和static變數。

data段包括三個部分:heap(堆)、stack(棧)和待用資料區。

  • 堆(heap):堆是用於存放進程執行中被動態分配的記憶體段。它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配記憶體時。新分配的記憶體就被動態加入到堆上(堆被擴張);當利用free等函數釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)
  • 棧(stack):棧又稱堆棧, 是使用者存放程式暫時建立的局部變數,也就是說我們函數括弧“{}”中定義的變數(但不包含static聲明的變數。static意味著在資料區段中存放變數)。

    除此以外,在函數被調用時。其參數也會被壓入發起調用的進程棧中。而且待到調用結束後。函數的返回值也會被存放回棧中。

    因為棧的先進先出特點,所以棧特別方便用來儲存/恢複調用現場。從這個意義上講,我們能夠把堆棧看成一個寄存、交換暫時資料的記憶體區。

當程式在運行時動態分配空間(C中的malloc函數),所分配的空間就屬於heap。其概念與資料結構中“堆”的概念不同。

stack段存放函數內部的變數、參數和返回地址,其在函數被調用時自己主動分配。訪問方式就是標準棧中的LIFO方式。

(由於函數的局部變數存放在此,因此其訪問方式應該是棧指標加位移的方式,否則若通過push、pop操作來訪問相當麻煩)

data段中的待用資料區存放的是程式中已初始化的全域變數、靜態變數和常量。

在採用段式記憶體管理的架構中(比方intel的80x86系統),BSS 段(Block Started by Symbol segment)一般是指用來存放程式中未初始化的全域變數的一塊記憶體地區,一般在初始化時 BSS 段部分將會清零。BSS 段屬於靜態記憶體配置。即程式一開始就將其清零了。

比方,在C語言之類的程式編譯完畢之後,已初始化的全域變數儲存在.data 段中,未初始化的全域變數儲存在.bss 段中。

text和data段都在可運行檔案裡(在嵌入式系統裡通常是固化在鏡像檔案裡)。由系統從可運行檔案裡載入;而BSS段不在可運行檔案裡,由系統初始化。

圖引自《C專家編程》

BSS段僅僅儲存沒有值的變數。所以其實它並不須要儲存這些變數的映像。執行時所須要的BSS段大小記錄在目標檔案裡,但BSS段並不佔領目標檔案的不論什麼空間。

//main.cint a = 0; //全域初始化區char *p1; //全域未初始化區main(){    static int c =0。 //全域(靜態)初始化區    int b; //棧    char s[] = "abc"; //棧    char *p2; //棧    char *p3 = "123456"; //"123456\0"在常量區,p3在棧上。    p1 = (char *)malloc(10);    p2 = (char *)malloc(20); //分配得來得10和20位元組的地區就在堆區。}


C語言的代碼記憶體布局具體解釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.