windows和linux記憶體儲存結構

2021-06-22 23:19:28 字數 1359 閱讀 1142

windows

乙個由c/c

++編譯的程式占用的記憶體分為以下幾個部分 

1、棧區(stack)— 由編譯器自動分配釋放,存放函式的引數值,區域性變數

的值等。其操作方式類似於資料結構中的棧。 

2、堆區(heap)— 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶

,呵呵。 

3、全域性區(靜態區)(static)— 全域性變數

和靜態變數

的儲存是放在一塊的,初始化的全域性變數

和靜態變數

在一塊區域,未初始化的全域性變數

和未初始化的靜態變數

在相鄰的另一塊區域。程式結束後由系統釋放。 

4、文字常量

區 — 常量

字串就是放在這裡的。程式結束後由系統釋放 

5、程式**區— 存放函式體的二進位制**。

linux

:區域性變數可以用型別相符的任意表示式來初始化,而全域性變數只能用常量表示式初始化,例如:

例如,全域性變數pi這樣初始化是合法的:

doublepi = 3.14 + 0.0016;

但這樣初始化是不合法的:

doublepi = acos(-1.0); 

區域性變數這樣初始化卻是可以的。

程式開始執行時要用適當的值來初始化全域性變數,所以初始值必須儲存在編譯生成的可執行檔案中,因此初始值在編譯時就要計算出來,然而上面第二種初始化的值必須在程式執行時呼叫acos函式才能得到,所以不能用來初始化全域性變數。請注意區分編譯時和執行時這兩個概念。為了簡化編譯器的c語言從語法上規定全域性變數只能用常量表示式來初始化。

如果全域性變數在定義時不初始化則初始值是0,如果區域性變數在定義時不初始化則初始值是不確定的。 棧

(高記憶體位址) 空洞

堆bss

段(未初始化資料段,用

0填充)

.data

資料段

.text

文字段(低記憶體位址)

關於不同型別的變數在記憶體中的位置:

1.     全域性變數 已初始化 位於.data資料段;未初始化 則位於.bss未初始化資料段。

2.     靜態(static)全域性變數也在.data資料段。

3.     區域性變數 在棧上。靜態區域性變數,並不是在呼叫函式時分配,在函式返回時釋放,而是像全域性變數一樣靜態分配,在.data資料段,但它的作用域只在函式中起作用。

4.     const修飾的全域性變數在.rodata唯讀資料段(const變數在定義時必須初始化,所以沒有所謂的未初始化const變數),唯讀資料段在和.text同乙個segment.

windows和linux的記憶體管理

windows的記憶體管理很是嚴謹,使用記憶體必須首先分配,當然每個作業系統都是這樣,然而windows的嚴謹在於分配的過程,分為保留和提交兩個階段,其中保留的含義就是在程序的虛擬位址空間保留一塊空間,不能用作他用,保留的概念是針對虛擬位址空間的,而提交的含義是將剛才保留的虛擬位址空間的虛擬記憶體塊...

Linux和Windows的記憶體區別

linux 系統 linux 優先使用物理記憶體,當物理記憶體還有空閒時,linux是不會釋放記憶體的,即時占用記憶體的程式已經被關閉了 這部分記憶體就用來做快取了 也就是 說,即時你 有很大的記憶體,用過一段時間後,也會被佔滿。這樣做的好處是,啟動那些剛開啟過的程式 或是讀取剛訪問過得資料會比較快...

C 共享記憶體實現(windows和linux)

共享記憶體是一種程序間通訊的方式,速度比較快 基本原理 以頁面為單位,將乙個普通檔案對映到記憶體中,達到共享記憶體和節約記憶體的目的,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代i o讀寫,以獲得較高的效能 windows和linux都提供了原生的系統級的c 介面,可以將檔案對映到記憶體...