存儲類的分類
存儲類是C語言與C++語言的標準中,變數與函式的可訪問性(即作用域範圍scope)與生存期(life time)。
存儲類可分為auto、register、static、extern、mutable、thread_local等。
auto類
auto類是指定於在{與}所限定的作用域內部的局部變數的預設存儲類。例如:
{
int Count;
auto int Month;
}
上述兩個變數具有相同的存儲類。實際上auto關鍵字一般都省略。
register
register關鍵字提示編譯器把局部變數或函式的形參儘可能放入CPU的暫存器中,以便快速訪問。因此變數的位元組長度不應該超過暫存器的長度。不要用取地址符(&)去獲得此變數的記憶體地址。例如:
{
register int Miles;
}
static
static是全局變數的默認存儲類。例如:
static int Count;
int Road;
main()
{
printf("%d\n", Count);
printf("%d\n", Road);
}
Count與Road兩個變數都是默認的static存儲類。
局部變數也可以具有static存儲類。例如:
void Func(void)
{
static sum=1;
}
實際上,static本意是指變數的值在程式生存期一直可以保持,而且變數需要初始化。全局變數加上static關鍵字,實際上改變的是全局變數的可見性,即僅在本編譯單元(translate unit)內部可見、可訪問,其它編譯單元不可訪問此全局變數。例如,上例中的全局變數count。
extern
extern存儲類是指全局變數可以被各個對象模組訪問。使用extern關鍵字時,表示變數已經在別處定義,所以不能在此處初始化。
mutable
mutable存儲類只能用於類的數據成員,不能用於普通變數。具有mutable性質的類的數據成員打破了類對象的const限定,允許修改類的mutable的數據成員,即便類的其它成員仍然是const唯讀屬性。
thread_local
適用於命名空間內的變數、全局作用域的變數、函式內部定義的靜態變數,如果使用了thread_local關鍵字,則在運行時不同的執行緒具有該變數的不同的存儲位置,即各有各的副本。因此,具有thread_local存儲類的變數,必然具有static存儲類性質,不管是否使用了static關鍵字。
C++2011的新定義的概念
C++2011標準 中,把storage class細分為 存儲持續(storage duration)與 連結性(linkage)兩大屬性。存儲持續期分為靜態存儲持續(static storage duration)、執行緒存儲持續(thread storage duration)、自動存儲持續(automatic storage duration)、動態存儲持續(dynamic storage duration)等總計4種互斥的情形。連結性分為外部連結性(external linkage)與內部連結性(internal linkage)。這些概念實際上是上述傳統的存儲類概念的規範化。