複製鏈接
請複製以下鏈接發送給好友

存儲類

鎖定
存儲類是C語言與C++語言的標準中,變量與函數的可訪問性(即作用域範圍scope)與生存期(life time)。存儲類可分為auto、register、static、extern、mutable、thread_local等。
中文名
存儲類
外文名
Storage Class
繁    體
存儲類
拼    音
cún chǔlèi
注    音
ㄘㄨㄣˊ ㄔㄨˇㄌㄟˋ
拉丁文名
adipiscing elit

存儲類存儲類的分類

存儲類是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標準 [1]  中,把storage class細分為存儲持續(storage duration)與鏈接性(linkage)兩大屬性。存儲持續期分為靜態存儲持續(static storage duration)、線程存儲持續(thread storage duration)、自動存儲持續(automatic storage duration)、動態存儲持續(dynamic storage duration)等共計4種互斥的情形。鏈接性分為外部鏈接性(external linkage)與內部鏈接性(internal linkage)。這些概念實際上是上述傳統的存儲類概念的規範化。
參考資料
  • 1.    International Standard.ISO/IEC 14882 Programming languages C++:ISO,2011年9月1日