1. 程式人生 > >C++ primer plus 第9章 記憶體模型和名稱空間

C++ primer plus 第9章 記憶體模型和名稱空間

C++11中,關鍵字auto用於自動型別推斷,但在C語言和以前的C++版本中,auto的含義截然不同,它用於顯式地指出變數Wie自動儲存。

1.自動變數和棧

程式必須在執行時對自動變數進行管理,常用方法:留出一段記憶體,並將其視為棧,以管理變數的增減。程式使用兩個指標來跟蹤棧,一個指標指向棧底——棧的開始位置,另一個指標指向堆頂——下一個可用記憶體單元。函式被呼叫時,其自動變數將被加入到棧中,棧頂指標指向變數後面的下一個可用的記憶體單元,函式結束時,棧頂指標被重置為函式被呼叫前的值,從而釋放新變數使用的記憶體。        棧是LIFO(後進先出)的

暫存器變數:關鍵字register——建議編譯器使用CPU暫存器來儲存自動變數,旨在提高訪問變數的速度。

register int cout_fast;

但是在C++11中,關鍵字register只是顯示的指出變數是自動的。

2.靜態持續變數

C++為靜態儲存持續性變數提供了3中連結特性:外部連結性(可在其他檔案中訪問)、內部連結性(只能在當前檔案中訪問)和無連結性(只能在當前函式或程式碼塊中訪問),靜態數目在程式執行期間是不變的,程式不需要使用特殊的裝置(如棧)來管理它們。編譯器將分配固定的記憶體塊來儲存所有的靜態變數。

要想建立連結性為外部的靜態持續變數,必須在程式碼塊的外面宣告它;要建立連結性為內部的靜態持續變數,必須在程式碼塊的外面宣告它,並使用static限定符;要建立沒有連結性的靜態持續變數,必須在程式碼塊內宣告它,並使用static限定符。

所有的靜態持續變數都有的初始化特徵:未被初始化的靜態變數的所有為都被設定為0。

單定義規則:在每個使用使用外部變數的檔案中,都必須宣告它;C++有“單定義規則”(One Definition Rule,ODR)——變數只能有一次定義。為滿足這種需求,C++提供了兩種變數宣告。一種是定義宣告——定義,它給變數分配儲存空間;另一種是引用宣告——宣告,它不給變數分配儲存空間,因為它引用已有的變數。引用宣告使用關鍵字extern,且不進行初始化:否則,宣告為定義,導致分配儲存空間。

定義與全域性變數同名的區域性變數後,區域性變數將隱藏全域性變數。但如果將作用域解析運算子(::)放在變數名前,該運算子表示使用變數的全域性版本。