C 記憶體模型

2021-07-11 22:20:45 字數 1137 閱讀 2074

1.在c++中,不要在標頭檔案中進行變數宣告。因為單定義規則的存在,不同原始檔中對於同乙個全域性變數只能夠定義一次。因此如果在標頭檔案中包含變數定義,那麼很有可能使用相同標頭檔案的原始檔會對這個變數產生多次定義。

2.new 與 delete等通過動態分配記憶體產生的資料將儲存在堆(heap)中。

3.在定義了命名空間之前,變數按照壽命分類,分為自動變數、靜態變數兩種。

4.自動變數是在函式中定義的變數,當函式結束後,儲存該變數的記憶體將清除。由於函式的呼叫與退出,自動變數的數量隨著程式的進行會發生改變。因此編譯器在記憶體中設定成為「棧(stack)」的區域,動態儲存自動變數。

5.自動變數的初始化與刪除(存在的時間與作用域)取決於其位於的**塊。

6.函式原型作用域內的變數名稱可以隨意設定,因為離開了包含引數列表的括號後,它就脫離了作用域。也就是說,函式宣告中的形參名稱與函式定義時的形參名稱可以不一樣,但是一般不會這樣做,因為可能會帶來混亂。

7.靜態變數由於數量固定,被編譯器儲存在固定的區域中。

8.靜態變數按照作用域(外部連線性、內部鏈結性、無鏈結性)分為三類。

具有外部鏈結性的靜態變數,又被稱為全域性變數,即在函式體外部宣告的變數。在其他原始檔中,可通過關鍵字extern進行引用宣告,進而使用。

只能夠內部鏈結的靜態變數,在函式體外部宣告,並使用關鍵字static,其作用域只能為本原始檔,其他原始檔若使用extern進行引用宣告會報錯。

在函式體中宣告的靜態變數,同樣需要使用關鍵字static,其作用域為函式體內部。當函式退出時,該靜態變數仍舊保留。

9.靜態變數初始化值預設為0。靜態指標預設記憶體為0x00000000,為指標位址賦值前需要改變指標位址,否則將出現「記憶體不能為read」的錯誤

10. 變數的宣告(非引用宣告extern),即等同於變數的定義。

11.帶關鍵字const宣告(或說定義)的變數的鏈結性是內部的,從這個角度來講const和static的作用相同。也就是說可以在標頭檔案中宣告帶const或static關鍵字的變數。若想讓乙個const常量具有外部鏈結性,在定義它的時候,需要新增extern關鍵字。例如 extern const int aa;

12.函式是預設具有外部鏈結性的。

13.函式的宣告可以很多次,但是函式的定義只能有一次。

14.帶static關鍵字的函式,其鏈結性為檔案內部。

c 記憶體模型

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

C記憶體模型

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

C 記憶體模型

這塊內容很重要,然而部落格上很多人都說的不是很明白或者有一些小錯誤,還是要自己動手才能豐衣足食。參考c primer plus 第九章 按時間區分 自動變數和棧 自動變數包括函式定義中的變數和函式的引數。對自動變數的管理的常用方法是留出一段記憶體,並將其視為棧。儲存遵循先進先出原則,生命週期是 塊的...