1. 程式人生 > >程式在記憶體中的分佈

程式在記憶體中的分佈

程式碼段(.text),也稱文字段(Text Segment),存放著程式的機器碼和只讀資料,可執行指令就是從這裡取得的。如果可能,系統會安排好相同程式的多個執行實體共享這些例項程式碼。這個段在記憶體中一般被標記為只讀,任何對該區的寫操作都會導致段錯誤(Segmentation Fault)。

資料段,包括已初始化的資料段(.data)和未初始化的資料段(.bss),前者用來存放儲存全域性的和靜態的已初始化變數,後者用來儲存全域性的和靜態的未初始化變數。資料段在編譯時分配。

堆疊段分為堆和棧:

  • (Heap):用來儲存程式執行時分配的變數。

       堆的大小並不固定,可動態擴張或縮減。其分配由malloc()、new()等這類實時記憶體分配函式來實現。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free          等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減) 堆的記憶體釋放由應用程式去控制,通常一個new()就要對應一個delete(),如果程式設計師沒有釋放掉,那麼在程式結束後作業系統會自動回收。

  • (Stack)是一種用來儲存函式呼叫時的臨時資訊的結構,如函式呼叫所傳遞的引數、函式的返回地址、函式的區域性變數等。 在程式執行時由編譯器在需要的時候分配,在不需要的時候自動清除。

        棧的特性: 最後一個放入棧中的物體總是被最先拿出來,這個特性通常稱為先進後出(FILO)佇列。

        棧的基本操作: PUSH操作:向棧中新增資料,稱為壓棧,資料將放置在棧頂; POP操作:POP操作相反,在棧頂部移去一個元素,並將棧的大小減一,稱為彈棧。

 堆和棧的區別

1.分配和管理方式不同

  •        堆是動態分配的,其空間的分配和釋放都由程式設計師控制。
  •        棧由編譯器自動管理。棧有兩種分配方式:靜態分配和動態分配。

                    靜態分配由編譯器完成,比如區域性變數的分配。

                    動態分配由alloca()函式進行分配,但是棧的動態分配和堆是不同的,它的動態分配是由編譯器進行釋放,無須手工控制。

2.產生碎片不同

  •       對堆來說,頻繁的new/delete或者malloc/free勢必會造成記憶體空間的不連續,造成大量的碎片,使程式效率降低。
  •       對棧而言,則不存在碎片問題,因為棧是先進後出的佇列,永遠不可能有一個記憶體塊從棧中間彈出。

3.生長方向不同

  •       堆是向著記憶體地址增加的方向增長的,從記憶體的低地址向高地址方向增長。
  •       棧的生長方向與之相反,是向著記憶體地址減小的方向增長,由記憶體的高地址向低地址方向增長。

相關推薦

C語言程式記憶體:靜態儲存區、堆、棧的區別

一、記憶體基本構成 可程式設計記憶體在基本上分為這樣的幾大部分:靜態儲存區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。 靜態儲存區:記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。它主要存放靜態資料、全域性資料和常量。 棧區:在執行函式時,函式內區域性變數的儲存單元都可以在

程式記憶體分佈

程式碼段(.text),也稱文字段(Text Segment),存放著程式的機器碼和只讀資料,可執行指令就是從這裡取得的。如果可能,系統會安排好相同程式的多個執行實體共享這些例項程式碼。這個段在記憶體中一般被標記為只讀,任何對該區的寫操作都會導致段錯誤(Segmentation Fault)。 資料段

C語言記憶體分佈程式執行(BSS段、資料段、程式碼段、堆疊)

BSS段:(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。BSS是英文Block Started by Symbol的簡稱。BSS段屬於靜態記憶體分配。 資料段 :資料段(data segment)通常是指用來存放程式中 已初始化 

C語言之程式記憶體分佈以及記憶體越界問題

C語言程式在記憶體中的分佈: bss段:該段用來存放沒有被初始化或者初始化為0的全域性變數,以及被static修飾的未初始化的區域性變數。在程式執行的整個生命週期內都存在於記憶體中。這個段中的變數只佔用程式執行時的記憶體空間,而不佔用程式檔案的儲存空間。   舉個例子

關於vs開發windows程式過程記憶體檢查二三事

做為一個C/C++程式設計師,面對資源管理是必不可少的。今天,我對我這些年的經驗的一些總結。 每一個程式在執行時都佔用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區或堆。 C 語言程式使用一對標準庫函式 malloc 和 free 在自由儲存區

使用Valgrind找出AndroidNative程式記憶體洩露問題

轉自 https://blog.csdn.net/roland_sun/article/details/46049485   Android程式通常使用Java程式編寫,由於Dalvik虛擬機器集成了垃圾回收機制,所以記憶體使用比較不容易出錯,通常就是一個本該被釋放的物件

易學筆記-計算機底層-第1章:計算機系統漫遊/1.4 處理器處理記憶體的指令/1.4.2 執行hello程式

執行hello程式 流程圖 解釋: 從鍵盤接受使用者輸入的hello 把該輸入通過IO橋送到匯流排介面,由匯流排介面送到暫存器 暫存器再通過I/O橋把hello送到主存 敲

C語言在記憶體分佈

先認識記憶體中的幾個區,下面的區都在記憶體中,意味著掉電會丟失。但是這不意味著記憶體條裡面真的是這樣,包括作業系統的分頁都只是對記憶體的一種管理方式,或者說是虛擬的邏輯管理。 棧區(stack):由編譯器自動分配釋放,存放函式的引數值、區域性變數、返回值等。其

剖析記憶體程式之祕

  記憶體管理是作業系統的核心任務;它對程式設計師和系統管理員來說也是至關重要的。在接下來的幾篇文章中,我將從實踐出發著眼於記憶體管理,並深入到它的內部結構。雖然這些概念很通用,但示例大都來自於 32 位 x86 架構的 Linux 和 Windows 上。這第一篇文章描述了

程式執行時的記憶體空間分佈

我們在寫程式時,既有程式的邏輯程式碼,也有在程式中定義的變數等資料,那麼當我們的程式進行時,我們的程式碼和資料究竟是存放在哪裡的呢?下面就來總結一下。 一、程式執行時的記憶體空間情況 其實在程式執行時,由於記憶體的管理方式是以頁為單位的,而且程式使用的地址都是虛擬地

C/C++變數在記憶體分佈

C/C++變數在記憶體中的分佈在筆試時經常考到,雖然簡單,但也容易忘記,因此在這作個總結,以加深印象。 先寫一個測試程式: #include <stdio.h> #include <malloc.h> int g_i = 100; int g_j = 200; int g

c程式記憶體分佈

        由C語言程式碼(文字檔案)形成可執行程式(二進位制檔案),需要經過編譯-彙編-連結三個階段。編譯過程把C語言文字檔案生成彙編程式,彙編過程把彙編程式形成二進位制機器程式碼,連結過

C/C++變數在記憶體分佈,堆疊區別,堆疊段,資料段,程式碼段,附加段

在C++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。 堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不

大頁記憶體(HugePages)在通用程式優化的應用

在介紹之前需要強調一點,大頁記憶體也有適用範圍,程式耗費記憶體很小或者程式的訪存區域性性很好,大頁記憶體很難獲得性能提升。所以,如果你面臨的程式優化問題有上述兩個特點,請不要考慮大頁記憶體。後面會詳細解釋為啥具有上述兩個特點的程式大頁記憶體無效。 背景

記憶體管理之程式記憶體分佈

在多工作業系統中的每一個程序都執行在一個屬於它自己的記憶體沙盤中。這個沙盤就是虛擬地址空間(virtual address space)。 1 32位虛擬記憶體佈局 在32位模式下虛擬地址空間總是一個4GB的記憶體地址塊。這些虛擬地址通過頁表(page table)對映到實體記憶體,頁表

在Eclipse使用MAT分析Android程式記憶體使用狀況(轉)

對於Android這種手持裝置來說,通常不會帶有太大的記憶體,而且一般使用者都是長時間不重啟手機,所以編寫程式的時候必須要非常小心的使用記憶體,儘量避免有記憶體洩露的問題出現。通常分析程式中潛在記憶體洩露的問題是一件很有難度的工作,一般都是由團隊中的資深工程師負責,而且隨著程式程式碼量的提高,難度還會逐步加大

linux記憶體管理--程序在記憶體分佈

一、程序與記憶體     所有程序(執行的程式)都必須佔用一定數量的記憶體,它或是用來存放從磁碟載入的程式程式碼,或是存放取自使用者輸入的資料等等。不過程序對這些記憶體的管理方式因記憶體用途不一而不盡相同,有些記憶體是事先靜態分配和統一回收的,而有些卻是按需要動態分配和回

程式記憶體的佈局

C語言程式在記憶體中的分佈 * 程式碼段(.text):存放著程式的機器碼和只讀資料(常量) * 全域性區(靜態區):由編譯器編譯時分配,程式執行結束後釋放(屬於靜態記憶體分配),在程式的二進位制檔案中,.bss段不佔儲存空間,只有在載入到記憶

C/C++程式記憶體區域劃分大總結

此圖來自http://www.blog.163.com/tao198352__4232/blog/static/8502064520105611157897/ 程式由程式碼和資料組成,其中程式碼儲存在程式碼區中,資料根據型別的不同儲存在不同的區域中

linux 反彙編分析變數地址並用gdb修改執行程式記憶體變數實驗

準備樣本檔案: a.c #include <stdio.h> #include <unistd.h> unsigned int a=0xFFFFFFFF; unsigned