📜  C++存储类

📅  最后修改于: 2020-09-25 05:09:43             🧑  作者: Mango

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

C++中的每个变量都有两个功能:类型和存储类。

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

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

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

局部变量

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

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

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

示例1:局部变量

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

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

关键字auto还用于定义局部变量,如下所示: auto int var;

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

全局变量

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

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

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

示例2:全局变量

#include 
using namespace std;

// Global variable declaration
int c = 12;

void test();

int main()
{
    ++c;

    // Outputs 13
    cout << c <

输出

13
14

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

该变量对于以上程序中的main()test()函数均可见。

静态局部变量

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

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

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

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

示例3:静态局部变量

#include 
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() 函数被调用2次。

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

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

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

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

1
1

注册变量(在C++ 11中不推荐使用)

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

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

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

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

线程本地存储

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

关键字thread_local用于此目的。

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