# 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")的更多信息。