原文: https://www.programiz.com/cpp-programming/storage-class

在本文中,您将了解 C++ 中的不同存储级别。 即:本地,全局,静态本地,寄存器和线程本地。

C++ 中的每个变量都有两个特性:类型和存储级别。

类型指定可以存储在变量中的数据类型。 例如:intfloatchar等。

并且,存储级别控制变量的两个不同属性:生存期(确定变量可以存在多长时间)和范围(确定程序的哪一部分可以访问它)。

根据变量的存储级别,它可以分为 4 种主要类型:


局部变量

在函数内部定义的变量(在括号内的函数主体内部定义)称为局部变量或自动变量。

它的范围仅限于定义它的函数。 简而言之,局部变量存在并且只能在函数内部访问。

函数退出时,局部变量的生命期结束(被销毁)。


示例 1:局部变量

  1. #include <iostream>
  2. using namespace std;
  3. void test();
  4. int main()
  5. {
  6. // local variable to main()
  7. int var = 5;
  8. test();
  9. // illegal: var1 not declared inside main()
  10. var1 = 9;
  11. }
  12. void test()
  13. {
  14. // local variable to test()
  15. int var1;
  16. var1 = 6;
  17. // illegal: var not declared inside test()
  18. cout << var;
  19. }

test()内部不能使用变量var,在main()函数内部不能使用var1

关键字auto之前也用于定义局部变量:auto int var;

但是,在 C++ 11 之后,auto具有不同的含义,不应用于定义局部变量。


全局变量

如果在所有函数之外定义了变量,则将其称为全局变量。

全局变量的范围是整个程序。 这意味着,在声明之后,可以在程序的任何部分使用和更改它。

同样,其寿命仅在程序结束时结束。


示例 2:全局变量

  1. #include <iostream>
  2. using namespace std;
  3. // Global variable declaration
  4. int c = 12;
  5. void test();
  6. int main()
  7. {
  8. ++c;
  9. // Outputs 13
  10. cout << c <<endl;
  11. test();
  12. return 0;
  13. }
  14. void test()
  15. {
  16. ++c;
  17. // Outputs 14
  18. cout << c;
  19. }

输出

  1. 13
  2. 14

在上述程序中,c是全局变量。

在上述程序中,此变量对函数main()test()均可见。


静态局部变量

关键字static用于指定静态变量。 例如:

  1. ... .. ...
  2. int main()
  3. {
  4. static float a;
  5. ... .. ...
  6. }

静态局部变量仅存在于声明了它的函数内部(类似于局部变量),但是其生存期始于调用函数时,并且仅在程序结束时结束。

局部变量和静态变量之间的主要区别在于,静态变量的值保留在程序的结尾。


示例 3:静态局部变量

  1. #include <iostream>
  2. using namespace std;
  3. void test()
  4. {
  5. // var is a static variable
  6. static int var = 0;
  7. ++var;
  8. cout << var << endl;
  9. }
  10. int main()
  11. {
  12. test();
  13. test();
  14. return 0;
  15. }

输出

  1. 1
  2. 2

在上述程序中,test()函数被调用 2 次。

在第一次调用期间,将变量var声明为静态变量,并将其初始化为 0。然后将 1 添加到屏幕上显示的var

当函数test()返回时,变量var仍然存在,因为它是静态变量。

在第二个函数调用期间,没有创建新的变量var。 将相同的var加 1,然后显示在屏幕上。

如果未将var指定为静态变量,则上述程序输出:

  1. 1
  2. 1

寄存器变量(在 C++ 11 中已弃用)

关键字register用于指定寄存器变量。

寄存器变量类似于自动变量,并且仅存在于特定函数中。 它应该比局部变量快。

如果程序遇到寄存器变量,则它将变量存储在处理器的寄存器中,而不是存储在内存中(如果有)。 这使其比局部变量更快。

但是,此关键字在 C++ 11 中已弃用,不应使用。


线程本地存储

线程本地存储是一种机制,通过该机制可以分配变量,以便每个现有线程有一个变量实例。

关键字thread_local用于此目的。

了解有关线程本地存储的更多信息。