1. 程式人生 > >40、程式中的記憶體佈局

40、程式中的記憶體佈局

先看一張示意圖:不同程式碼在可執行程式中的對應關係


    程式和程序的不同:

    程式是 靜態的 概念,表現形式為一個可執行檔案
程序是 動態的 概念,程式由作業系統載入執行後得到程序
每個程式可以對應多個程序
每個程序只能對應一個程式

問題:包含指令碼程式碼的文字檔案是一種型別的可執行程式嗎?如果是,對應什麼樣的程序呢?


指令碼程式是一種可執行程式,但是它需要作業系統載入指令碼解釋程式來生成程序,然後程序對指令碼檔案進行讀取並解釋執行。

檔案佈局在記憶體中的對映:

    

各個段的作用:
堆疊段在程式執行後才正式存在,是程式執行的基礎
.bss段存放的是未初始化全域性變數和靜態變數
.text段存放的是程式中的可執行程式碼
.data段儲存的是已經初始化了的全域性變數和靜態變數

.rodata段存放程式中的常量值,如字串常量

靜態儲存區通常指程式中的.bss和.data段
只讀儲存區通常指的是程式中的.rodata段(const修飾的變數)
區域性變數所佔空間為棧上的空間
動態空間為堆上的空間
程式可執行程式碼存放在.text段

問題:同是全域性變數和靜態變數,為什麼初始化和未初始化的儲存在不同段中?

效率問題。
未初始化變數(.bss)的在載入時全部初始化為0,這樣載入速度可以更快。初始化(.data)後的變數必須在載入時保證一一對應,且必須儲存好,相對複雜一點。區分儲存有利於程式載入。

小結:
程式原始碼在編譯後對應可執行程式中的不同儲存區
程式和程序不同,程式靜態概念,程序是動態概念
堆疊段是程式執行的基礎,只存在於程序空間中


程式可執行程式存放於.text段,是隻讀的
.bss(未初始化的)和.data(已經初始化的)段用於儲存全域性變數和靜態變數