今天我們繼續來學習資料在記憶體中的儲存;
c/c++程式記憶體的分配
乙個由c/c++編譯的程式占用的記憶體分別為一下幾個部分:
1、棧區(stack)---- 由編譯器自動分配釋放,存放為執行函式而分配的區域性變數、函式引數、返回資料、返回位址等。其操作方式類似於資料結構中的棧。
2. 堆區(heap)---- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。分配方式類似於鍊錶。
3. 全域性區(靜態區) (static)---- 存放全域性變數、靜態資料、常量。程式結束後由系統釋放。
4. 文字常量區 ---- 常量字串就是放在這裡的。程式結束後由系統釋放。
5. 程式**區 ---- 存放函式體 (類成員函式和全域性函式)的二進位制**。
記憶體分配有三種方式:
1、從靜態儲存區域分配
內存在程式編譯的時候就已經分配好了,這塊內存在程式的整個執行期間都存在。例如全域性變數、static變數。
2、在棧上建立
在執行函式時,函式內部變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動釋放。棧記憶體分配
運算內置於處理器的指令集中,效率高,但是分配的內容量有限。
3、從堆上分配
亦稱動態記憶體分配
程式在執行的時候用malloc或new申請任意多少記憶體,
程式設計師自己負責在何時使用free或delete釋放記憶體。
變數的儲存位置
普通儲存
執行時堆疊
硬體暫存器
變數的預設儲存型別取決於它的申明位置
1.凡是在任何**塊之外的宣告的變數總是儲存於靜態記憶體中。
不屬於堆疊記憶體,這類變數稱為靜態變數。講台變數在函式執行之前建立。
2.在**塊內部宣告的變數預設儲存型別是自動的。
儲存於堆疊中
3.對於在**塊內部宣告的變數,如果給他加上static關鍵字,可以是它的儲存型別由自由轉變為靜態。
具有靜態儲存型別的變數在整個程式執行過程中一直存在。
注意:修改變數的儲存型別並不修改變數的作用域,它只能在該**塊內部按名字訪問。
4.暫存器變數:register關鍵字
變數的初始化:
如果不顯示的初始化,靜態變數的說出實話為0,二自動變數是不做任何初始化的,是隨機值。
static總結:1. 當它作用於函式定義時,或者用**塊之外的變數宣告時,static關鍵字用於修改識別符號的鏈結屬性。外部鏈結屬性變為內部 鏈結屬性,識別符號的儲存型別和作用於不變。也就是說變數或者函式只能在當前原始檔中訪問。不能再其他原始檔中訪問。
2.當它用於**塊內部時,static關鍵字用於修改變數的儲存型別。從自動變數變為靜態變數。變數的屬性和作用於不受影響。
static ---- 修飾區域性變數
生命週期:生命週期是整個程式的生命週期
作用域:區域性作用域
儲存位置:靜態區
static ---- 修飾全域性變數
static修飾的鏈結屬性只能在當前原始檔使用
static ---- 修飾函式
static修飾的鏈結屬性只能在當前原始檔使用
深度剖析資料在記憶體中的儲存
我們要想知道資料如何在記憶體中的儲存,就必須先談談資料型別的意義 1 如果我們把記憶體看成乙個個房間,那麼資料型別就決定了房間號和房間大小,這樣應該很好理解了吧 接下來我們來談談資料型別的分類 1 整形家族 char 有符號字元型,只不過把signed省略了 unsigned char 無符號型別字...
剖析資料在記憶體中的儲存
乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據及不同的型別所決定的。在討論資料在所開闢記憶體中是如何儲存的之前要了解以下概念。例 答案 1,1,255 解析 首先要進行整形提公升,提公升時,要看自己的型別,有符號新增 1 無符號則新增 0 要看變數的型別 確定是否有符號位 若為無符號位,直...
深度剖析資料在記憶體中的儲存(整型和浮點型)
我們知道乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據不同的型別而決定的,而且不同的型別也影響著我們看待記憶體空間的視角。比如 int a 20,float b 5.0 接下來我們看看資料在所開闢的型別中是如何儲存的?整型家族 char unsigned char,signed char ...