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 介面,可以將檔案對映到記憶體...