多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# C++ 存储级别 > 原文: [https://www.programiz.com/cpp-programming/storage-class](https://www.programiz.com/cpp-programming/storage-class) #### 在本文中,您将了解 C++ 中的不同存储级别。 即:本地,全局,静态本地,寄存器和线程本地。 C++ 中的每个变量都有两个特性:类型和存储级别。 类型指定可以存储在变量中的数据类型。 例如:`int`,`float`,`char`等。 并且,存储级别控制变量的两个不同属性:生存期(确定变量可以存在多长时间)和范围(确定程序的哪一部分可以访问它)。 根据变量的存储级别,它可以分为 4 种主要类型: * [局部变量](#local_variable) * [全局变量](#global_variable) * [静态局部变量](#static_variable) * [寄存器变量](#register variable) * [线程本地存储](#thread_local_storage) * * * ## 局部变量 在函数内部定义的变量(在括号内的[函数](/cpp-programming/function "C++ functions")主体内部定义)称为局部变量或自动变量。 它的范围仅限于定义它的函数。 简而言之,局部变量存在并且只能在函数内部访问。 函数退出时,局部变量的生命期结束(被销毁)。 * * * ### 示例 1:局部变量 ```cpp #include <iostream> using namespace std; void test(); int main() { // local variable to main() int var = 5; test(); // illegal: var1 not declared inside main() var1 = 9; } void test() { // local variable to test() int var1; var1 = 6; // illegal: var not declared inside test() cout << var; } ``` 在`test()`内部不能使用变量`var`,在`main()`函数内部不能使用`var1`。 关键字`auto`之前也用于定义局部变量:`auto int var;` 但是,在 C++ 11 之后,[`auto`](http://en.cppreference.com/w/cpp/language/auto)具有不同的含义,不应用于定义局部变量。 * * * ## 全局变量 如果在所有函数之外定义了变量,则将其称为全局变量。 全局变量的范围是整个程序。 这意味着,在声明之后,可以在程序的任何部分使用和更改它。 同样,其寿命仅在程序结束时结束。 * * * ### 示例 2:全局变量 ```cpp #include <iostream> using namespace std; // Global variable declaration int c = 12; void test(); int main() { ++c; // Outputs 13 cout << c <<endl; test(); return 0; } void test() { ++c; // Outputs 14 cout << c; } ``` **输出** ```cpp 13 14 ``` 在上述程序中,`c`是全局变量。 在上述程序中,此变量对函数`main()`和`test()`均可见。 * * * ### 静态局部变量 关键字`static`用于指定静态变量。 例如: ```cpp ... .. ... int main() { static float a; ... .. ... } ``` 静态局部变量仅存在于声明了它的函数内部(类似于局部变量),但是其生存期始于调用函数时,并且仅在程序结束时结束。 局部变量和静态变量之间的主要区别在于,静态变量的值保留在程序的结尾。 * * * ### 示例 3:静态局部变量 ```cpp #include <iostream> using namespace std; void test() { // var is a static variable static int var = 0; ++var; cout << var << endl; } int main() { test(); test(); return 0; } ``` **输出** ```cpp 1 2 ``` 在上述程序中,`test()`函数被调用 2 次。 在第一次调用期间,将变量`var`声明为静态变量,并将其初始化为 0。然后将 1 添加到屏幕上显示的`var`。 当函数`test()`返回时,变量`var`仍然存在,因为它是静态变量。 在第二个函数调用期间,没有创建新的变量`var`。 将相同的`var`加 1,然后显示在屏幕上。 **如果未将`var`指定为静态变量**,则上述程序输出: ```cpp 1 1 ``` * * * ## 寄存器变量(在 C++ 11 中已弃用) 关键字`register`用于指定寄存器变量。 寄存器变量类似于自动变量,并且仅存在于特定函数中。 它应该比局部变量快。 如果程序遇到寄存器变量,则它将变量存储在处理器的寄存器中,而不是存储在内存中(如果有)。 这使其比局部变量更快。 但是,此关键字在 C++ 11 中已弃用,不应使用。 * * * ## 线程本地存储 线程本地存储是一种机制,通过该机制可以分配变量,以便每个现有线程有一个变量实例。 关键字`thread_local`用于此目的。 了解有关[线程本地存储](http://www.codeproject.com/Articles/8113/Thread-Local-Storage-The-C-Way "Thread local storage")的更多信息。