乙個c/c++程式占用的記憶體可分為以下5種:
2. 堆區:一般由程式設計師分配和釋放,此堆和資料結構堆完全是兩回事,此堆的分配釋放方式類似於鍊錶。執行時操作。
3. 全域性/靜態區:全域性變數和靜態變數存放於此。而初始化和非初始化的全域性/靜態變數又放在不同的兩塊。程式結束由系統釋放。
4. 文字常量區:常量字串放在此處。程式結束由系統釋放。
5. 程式**區:存放函式體的二進位制**。
堆和棧的比較:
1. 申請方式
棧有系統自動操作完成,由高位址向地位址操作。
堆由程式設計師操作完成。
2. 大小控制
棧的大小依賴於系統(但是可以便以前修改)。
堆由程式設計師指定。
3. 系統響應
對於棧,如果申請大小超出棧區剩餘空間,則報出棧區溢位異常。
對於堆,系統先順向查詢第乙個空間大於申請空間的堆節點,然後刪除申請的部分,將剩餘部分重新接上,類似鍊錶操作。
4. 申請效率
棧由系統操作,速度較快,但程式設計師無法控制,不靈活。
堆有程式設計師使用關鍵字操作,比較慢,但程式設計師可以控制,使用靈活。
5. 訪問效率
char stack="12345";
char *heap="67890";
"12345"是在執行時進行賦值操作的,"67890"是在編譯時進行的。
但是,以後的訪問速度上,前者要快於後者,因為後者多一次讀取操作。
51: char cs=stack[0];//對應的彙編**兩次move操作
0040114d mov dl,byte ptr [ebp-14h]
00401150 mov byte ptr [ebp-1ch],dl
52: char ch=heap[0];//對應的彙編**三次move操作
00401153 mov eax,dword ptr [ebp-18h]
00401156 mov cl,byte ptr [eax]
00401158 mov byte ptr [ebp-20h],cl
程式執行時的記憶體分配
一 在程式執行期間,變數儲存空間有三種 1 靜態儲存區。內存在程式編譯的時候就已經分配好了,這塊內存在程式執行期間都存在,儲存全域性變數和靜態變數。2 棧儲存區。記憶體是在程式執行期間才分配的,函式內區域性變數及函式引數的儲存單元,當 函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理...
c 程式執行時的記憶體分配
c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。2 堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個del...
程式編譯後執行時的記憶體分配
參考文章之編譯 執行 參考文章之執行程式時的記憶體分配方式 bss段 參考文章之程式執行時的記憶體分配 參考文章之堆 棧 1.程式編譯時的記憶體狀況 編譯時不分配記憶體。編譯器能夠識別語法,資料型別等 然後逐行逐句檢查編譯成資料的.obj檔案 然後再由連線程式將其連線成乙個exe檔案 此時的程式以e...