C 記憶體模型

2021-10-04 02:44:46 字數 2109 閱讀 1401

這塊內容很重要,然而部落格上很多人都說的不是很明白或者有一些小錯誤,還是要自己動手才能豐衣足食。

參考c++ primer plus 第九章

按時間區分:

自動變數和棧

自動變數包括函式定義中的變數和函式的引數。

對自動變數的管理的常用方法是留出一段記憶體,並將其視為。儲存遵循先進先出原則,生命週期是**塊的執行週期。

暫存器變數是建議cpu暫存器來儲存的自動變數,旨在提高訪問速度。c++11之後沒什麼卵用了。

register

int count_fast;

靜態變數

編譯器分配固定的記憶體來儲存所有的靜態變數,

初始化過程:首先靜態變數被初始化為0,編譯器計算常量表示式執行常量表示式初始化,有一些初始化需要呼叫外部函式,需要等到該函式被鏈結且程式執行時才能初始化。

\rightarrow

→全域性變數

\rightarrow

→static 全域性變數

\rightarrow

→static 區域性變數

函式的鏈結性

語言鏈結性

c++編譯器會對過載函式生成不同的符號名稱(加上數字編號),c中乙個名稱對應乙個函式,如果要在c++中調c函式,就要加關鍵字extern

關鍵字extern又出現了!!!!!dell emc spe面試的時候考過這乙個,然而我當時並不會。

extern

"c"void

spiff

(int);

//use c protocol for name look-up

extern

void

spiff

(int);

//use c++ protocol for name look-up

extern

"c++"

void

spiff

(int

)//use c++ protocal for name look-up

儲存說明符

cv-限定符

動態分配記憶體

c++ new 或c malloc()分配的記憶體,不受作用域和鏈結規則的控制,由運算子new delete控制(malloc() free())。由new 分配,delete或程式結束時**。

new運算子初始化的方式

int

*pi =

newint[6

];int*pi2 =

newint

;//c++ 11

double

*pd =

newdouble

(99.99);

double

*pd2 =

newdouble

;//c++ 11

class

myclass};

myclass *pc =

newmyclass(6

);struct where

;where * one =

new where

;//c++ 11

int*ar =

newint[4

];//c++ 11

//分配記憶體時的轉換過程

int* pi3 =

newint

;//int* pi3 = new(sizeof(int));

int* pa3 =

newint[40

];//int* pa3 = new(40*sizeof(int));

new 失敗時丟擲異常std::bad_alloc

delete delete

對於基本資料型別這兩個是一樣的,只是在釋放字串之外的陣列用delete會warning(眾所周知,warning等於沒有)

對於類delete 呼叫所有析構函式,釋放new 分配的記憶體空間

delete 呼叫第乙個析構函式, 釋放new分配的記憶體空間

c 記憶體模型

1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static全域性變數和靜態變數的存放區域。初始化的全域性變數和...

C 記憶體模型

1.在c 中,不要在標頭檔案中進行變數宣告。因為單定義規則的存在,不同原始檔中對於同乙個全域性變數只能夠定義一次。因此如果在標頭檔案中包含變數定義,那麼很有可能使用相同標頭檔案的原始檔會對這個變數產生多次定義。2.new 與 delete等通過動態分配記憶體產生的資料將儲存在堆 heap 中。3.在...

C記憶體模型

程式執行時作業系統把磁碟的 load到記憶體,然後分配給該程序乙個記憶體空間,分為堆區,棧區,全域性區和 區如圖1所示。作業系統找到main函式開始執行程式。圖1 記憶體模型 區 存放程式的二進位制 全域性區 全域性變數和靜態變數。初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始...