9 記憶體模型

2021-09-11 17:32:26 字數 1575 閱讀 1616

標頭檔案:標頭檔案通常包含以下內容:

函式原型

使用#define 或const定義的符號常量

結構宣告

類宣告模板宣告

內聯函式

(c++有三種(c++11有四種)方案儲存資料)

自動儲存持續性:有兩種變數是自動儲存連續性:自動變數、暫存器變數

在函式定義中宣告的變數(包括形參)的儲存連續性為自動的。預設情況下,作用域為區域性,沒有鏈結性。

位置:自動變數的儲存位置為棧,棧的空間棧頂為高位址,棧底為低位址。

靜態儲存連續性:

在函式定義外定義的變數和使用關鍵字static定義的變數的儲存持續性都是靜態的。在程式執行期間都存在。其提供了三種鏈結性:外部鏈結性(可在其他檔案訪問(在**塊外面宣告它,不可加static修飾))、內部鏈結性(只能在當前檔案中訪問(**塊外宣告,並使用static修飾))、無鏈結性(只能在當前**塊訪問(在**塊內,並用static修飾))。若沒有初始化,其值預設為0。

執行緒儲存持續性(c++11):

變數如是使用關鍵字thread_local宣告的則其宣告週期和執行緒一樣。

動態儲存持續性:

new運算子分配的記憶體會一直存在,直到用delete或程式結束為止。

作用域描述了名稱在檔案的多大範圍可見。

鏈結性描述了名稱如何在不同檔案間共享。

作用域為區域性的變數只能在定義它的**塊可用。作用域為全域性變數在定義位置到 檔案結尾可用。在函式原型作用域使用的名稱可在包含引數列表的括號內可用。

在每個使用外部變數的檔案中,都必須宣告它,同時,變數只能定義一次定義給變數分配空間,宣告不分配空間,它引用已有的變數。所以要在多個檔案中使用外部變數,只需在乙個檔案中包含該變數的定義,其他檔案必須使用extern宣告。

若內部鏈結性,則可以使用static限定其只在該檔案有效。當與外部鏈結性的同名,則遮蔽外部鏈結性的全域性變數。

const影響儲存型別,預設下全域性變數鏈結性為外部,但是const全域性變數為內部,和static類似。

使用:若需要在其他檔案使用,則需要將其放在標頭檔案中,若其儲存型別為外部,在標頭檔案定義則會產生二次定義錯誤,所以其為內部鏈結性

若需要將其設定為外部鏈結性,則定義如下 extern const a=0;此定義只能有一次,否則產生二次定義錯誤,則其他檔案只能宣告該常量。

在**塊中定義的const只能在該**塊有效。

**函式的儲存型別為外部儲存型別,所以可以用extern宣告(可選的,也可以不宣告直接使用)。**可以使用static使得其為內部鏈結性。

extern "c" void spiff(int);//使用c語言鏈結性

extern "c++" void spaff(int);//使用c++語言連線性

型別記憶體模型(物件記憶體模型)

型別的記憶體模型的3個問題 1 包含什麼 附加資訊 2 怎麼布局 記憶體對齊 3 使用場景 怎麼使用附加資訊 除了包含結構型別的顯式成員變數外,型別記憶體模型需要解決附加資訊的引入問題 1 附加資訊 opaque 有哪些 型別資訊 函式資訊 繼承資訊 記憶體計數等 2 為什麼有附加資訊 1 解決多型...

C 基礎 記憶體模型記憶體分割槽模型

區 存放函式體的二進位制 由作業系統進行管理 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配釋放,存放函式的引數值 區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 存放cpu執行的機器指令,區是共享的,只有乙份 是唯讀的。存放全域性變數 定義...

jvm記憶體模型 JVM記憶體模型詳情解析

一 結構圖 note string常量池 存在 堆記憶體中 二 各部分詳情解析 1 堆1 老年代 物件年齡 經過一次 monitor gc 年齡加1 15 的會存到 老年代 2 年輕代 3 常量池 string常量 儲存在堆中 2 虛擬機器棧 1 區域性變數表 2 運算元棧 3 動態鏈結 4 方法出...