C++ 存儲類型
發(fā)布時間:2023-12-04 15:16:11
C++中的存儲類型有
auto,register,static,extern,mutable,thread_local (C++11),存儲類型說明了變量要在進(jìn)程中分配內(nèi)存空間位置,可以為變量分配內(nèi)存存儲空間的有數(shù)據(jù)區(qū)、BBS區(qū)、棧區(qū)、堆區(qū)。本文主要介紹C++中的存儲類型。
代碼區(qū):存放CPU執(zhí)行的機器指令,代碼區(qū)是可共享,并且是只讀的。
數(shù)據(jù)區(qū):存放已初始化的全局變量、靜態(tài)變量(全局和局部)、常量數(shù)據(jù)。
BBS區(qū):存放的是未初始化的全局變量和靜態(tài)變量。
棧區(qū):由編譯器自動分配釋放,存放函數(shù)的參數(shù)值、返回值和局部變量,在程序運行過程中實時分配和釋放,棧區(qū)由操作系統(tǒng)自動管理,無須程序員手動管理。
堆區(qū):堆是由malloc()
函數(shù)分配的內(nèi)存塊,使用free()
函數(shù)來釋放內(nèi)存,堆的申請釋放工作由程序員控制,容易產(chǎn)生內(nèi)存泄漏。
C語言包含4種儲存類型,如下表:
特征 | 自動儲存類型 | 寄存器儲存類型 | 靜態(tài)儲存類型 | 外部儲存類型 |
關(guān)鍵字 | auto | register | static | extern |
儲存于 | 內(nèi)存 | CPU寄存器 | 內(nèi)存 | 內(nèi)存 |
默認(rèn)初始值 | 垃圾值 | 垃圾值 | 0或空白符 | 0或空白符 |
作用域 | 局限于塊 | 局限于塊 | 局限于塊 | 全局 |
生命周期 | 塊內(nèi) | 塊內(nèi) | 存在于函數(shù)之間 | 存在于函數(shù)之間 |
注意:塊指的是寫在左右花括號:{ }
內(nèi)的一組語句。局部變量是聲明在塊內(nèi)的變量。從 C++ 17 開始,auto
關(guān)鍵字不再是 C++ 存儲類說明符,且 register
關(guān)鍵字被棄用。
1、auto存儲類型
C++ 98標(biāo)準(zhǔn)/C++03標(biāo)準(zhǔn)
同C語言的意思完全一樣:auto被解釋為一個自動存儲變量的關(guān)鍵字,也就是申明一塊臨時的變量內(nèi)存。
C++ 11標(biāo)準(zhǔn)
在C++11標(biāo)準(zhǔn)的語法中,auto
被定義為自動推斷變量的類型。
例如,
auto d=4.38; //double
auto s("hello"); //const char*
auto z = new auto(10); // int*
auto x1 = 5, x2 = 5.0, x3='c';//錯誤,必須是初始化為同一類型
注意:C++11的auto
關(guān)鍵字時有一個限定條件,那就是必須給申明的變量賦予一個初始值,否則編譯器在編譯階段將會報錯。
2、extern存儲類型
extern
用來聲明在當(dāng)前文件中引用在當(dāng)前項目中的其它文件中定義的全局變量。如果全局變量未被初始化,那么將被存在BBS區(qū)中,且在編譯時,自動將其值賦值為0,如果已經(jīng)被初始化,那么就被存在數(shù)據(jù)區(qū)中。全局變量,不管是否被初始化,其生命周期都是整個程序運行過程中,為了節(jié)省內(nèi)存空間,在當(dāng)前文件中使用extern
來聲明其它文件中定義的全局變量時,就不會再為其分配內(nèi)存空間。
例如,
#include <iostream>
int i; //相當(dāng)于這個全局變量是在其它文件中定義的
extern int i; //聲明引用全局變量i
int main(void)
{
std::cout << "in main i=" << i << std::endl;
return 0;
}
注意:如果要調(diào)用另外一個文件中的全局變量,如果再聲明一個同名的全局變量,那么編譯器會因為重名報錯,這個時候就要使用extern
變量。extern
聲明告訴編譯器這個變量的定義在其他文件中,所以并不會為它分配內(nèi)存。
3、register存儲類型
聲明為register
的變量在由內(nèi)存調(diào)入到CPU寄存器后,則常駐在CPU的寄存器中,因此訪問register
變量將在很大程度上提高效率,因為省去了變量由內(nèi)存調(diào)入到寄存器過程中的好幾個指令周期。
例如,
#include <iostream>
using namespace std;
int main(void)
{
register int i,sum=0;
for(i=0;i<100;i++)
sum=sum+1;
cout << sum << endl;
- 上一篇:C++ 標(biāo)準(zhǔn)庫
- 下一篇:C++ 作用域及命名空間