C++ 中的存储类别


2022年9月1日, Learn eTutorial
1754

本教程将向您介绍 C++ 中的各种存储类。主要有五种类型:局部、全局、静态局部、寄存器和线程局部。

在 C++ 中,每个变量都有两个属性:类型和存储类。指定了可以在变量中存储的数据类型。例如,int、float、char 等。除此之外,存储类还控制两个不同的变量属性,如生命周期(变量可以存在的时间长度)和作用域(决定程序哪个部分可以访问它)。

在 C++ 程序中,存储类用于定义变量和/或函数的生命周期和可见性。变量的生命周期是它活动的时间量,其可见性是程序中它可以访问的模块。

根据其存储类,变量可以分为四种主要类型:

  1. 局部变量
  2. 全局变量
  3. 静态局部变量
  4. 寄存器变量
  5. 线程局部存储

1.   局部变量

局部变量,也称为自动变量,是在函数内部定义的变量(它将在函数体内大括号之间定义)。它的作用域仅限于定义它的函数。这意味着局部变量只存在于函数内部并只能在函数内部访问。当函数退出时,局部变量的生命周期结束(它被销毁)。

局部变量示例


#include <iostream>

using namespace std;

void test();

int main() {
    // local variable to main()
    int
    var = 5;

    test();

    // it is illegal: var1 is not declared inside main()
    var1 = 9;
}

void test() {
    // local variable to test()
    int var1;
    var1 = 6;

    // it is illegal: var is not declared inside test()
    cout <<
        var;
}

Var 不能在 test() 中使用,而 var1 不能在 main() 函数中使用。

以前,关键字 auto 用于定义局部变量,如 auto int var;

然而,C++11 之后,auto 有了新的含义,不应再用于定义局部变量。

2.   全局变量

当变量在所有函数外部定义时,它被称为全局变量。全局变量的作用域是整个程序。这意味着它在声明后可以在程序的任何地方使用和更改。

同样,它的存在仅在程序终止或结束时结束。

全局变量示例

#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;
}

输出

13
14

C 是上述程序中的全局变量。在前面的程序中,这个变量对 main() 和 test() 函数都可见。

3.   静态局部变量

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


... .. ...
int main()
{
   static float a;
   ... .. ...
}

静态局部变量仅存在于声明它的函数中(像局部变量一样),但它的生命周期在函数被调用时开始,并且仅在程序终止时结束。

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

静态局部变量示例

#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;
}

输出

1
2

在前面的程序中,test() 函数被调用了两次。

变量 var 在第一次调用期间被声明为静态变量并初始化为 0。然后将数字 1 添加到 var 中,并在屏幕上显示。
由于变量 var 是静态变量,它在函数 test() 返回后仍然存在。

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

如果 var 没有被指定为静态变量,则前面程序的输出将是
1
1

4.   寄存器变量 

寄存器变量使用关键字 register 指定。寄存器变量,像自动变量一样,只存在于单个函数中。它需要比局部变量更快。

当程序遇到寄存器变量时,如果内存可用,它会将其存储在处理器的寄存器中而不是内存中。因此,它比局部变量更快。然而,这个关键字在 C++11 中已弃用,不应再使用。

5.   线程局部存储

线程局部存储是一种分配变量的机制,以便每个线程都有一个变量实例。为此,使用关键字 thread_local

C++ 中存储类的类型

C++ 程序中可以使用五种不同类型的存储类。

  1. 自动
  2. 寄存器
  3. 静态
  4. 外部
  5. 可变
C++ Storage Class

1. 自动存储类

它是所有局部变量的默认存储类。auto 关键字会自动应用于所有局部变量。


{   
   auto int y;  
   float y = 3.45;  
} 
 

在上面的示例中,定义了两个具有相同存储类的变量;auto 只能在函数内部使用。

2.   寄存器存储类

寄存器变量将内存存储在寄存器中而不是 RAM 中。其大小与寄存器大小相同。它可以比其他变量更快地访问。

建议您只将寄存器变量用于快速访问,例如在计数器中。
 

注意 :我们无法获取寄存器变量的地址。


register int counter=0;    
 

3. 静态存储类

静态变量只初始化一次,并一直存在直到程序终止。即使多次调用函数,它也保留其值。编译器为静态变量提供默认值 0

例如


#include <iostream>  
using namespace std;  
void func() {    
    static int i=0; //static variable    
    int j=0; //local variable    
    i++;    
    j++;    
    cout<<"i=" << i<<" and j=" <<j<<endl;    
}    
int main()  
{  
    func();    
    func();    
    func();    
} 

输出

i= 1 and j= 1
i= 2 and j= 1
i= 3 and j= 1