行程與行程抽象

資料區段(data segment)

有些食材是事先量好的:一包標著「麵粉 200 公克」的東西,你在開始前就放到流理臺上。資料區段就是行程記憶體中存放「已經帶有起始值、寫進程式裡」的變數的部分,從行程一開始就準備好、待命。

具體來說,資料區段儲存在原始碼中被初始化為非零值的全域與靜態變數,例如一個設為 1 的全域計數器,或一個字串常數。由於起始值在編譯時就已知,它們被存放在可執行檔裡,並在程式載入時複製進記憶體中的資料區段。與文字區段不同,資料區段是可讀寫的:程式在執行時可以改變這些變數。在經典配置中它就位於文字區段的上方,並且與 BSS 有別——BSS 存放從零開始的變數(因此不需要儲存任何值,只需保留空間)。

這個區分的意義主要在於理解記憶體使用與程式啟動。必須被初始化的資料會在磁碟上的可執行檔裡佔用空間(那些值總得存在某處),而被初始化為零的資料則不會。所以把已初始化資料與未初始化資料分開,可以讓可執行檔更小。一個常見的混淆是把「資料」與「BSS」混為一談;它們都是給全域/靜態變數用的,但一個帶著明確的起始值,另一個只是在行程啟動時被歸零。

像「static int limit = 100;」這樣的一行,會把 limit 放進資料區段,並帶著儲存的值 100。像「static int total;」這樣的一行,則把 total 放進 BSS,在那裡它單純地從 0 開始。

非零起始值放在資料區;從零開始放在 BSS。

資料區段是可讀寫的,所以不像唯讀的文字區段那樣可在行程間共享;每個行程都拿到自己一份可寫的副本。

又稱
initialized data segmentdata section資料區段已初始化資料區