跳到主要内容

C++ 存储类

提示
  1. 存储类的概念:在C++中,每个变量具有两个特性:类型和存储类。类型指定变量可以存储的数据类型,而存储类控制变量的生命周期(确定变量存在多长时间)和作用域(确定程序的哪个部分可以访问它)。
  2. 主要的存储类:根据变量的存储类,可以将其分为四种主要类型:局部变量、全局变量、静态局部变量、寄存器变量(在C++11中已弃用)和线程局部存储。
  3. 不同存储类的特点:局部变量只在定义它们的函数内部存在,全局变量在整个程序中都可见,静态局部变量仅在函数内部存在但其值在程序结束前保持不变,而register关键字(已弃用)用于指定寄存器变量,thread_local用于线程局部存储。

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

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

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

根据变量的存储类,可以将其分为 4 大类型:

[局部变量

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

其作用域仅限于定义它的函数。简单来说,局部变量只存在于并且只能在函数内部访问。

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

示例 1:局部变量

#include <iostream>
using namespace std;

void test();

int main()
{
// main() 的局部变量
int var = 5;

test();

// 非法:var1 在 main() 内没有声明
var1 = 9;
}

void test()
{
// test() 的局部变量
int var1;
var1 = 6;

// 非法:test() 内没有声明 var
cout << var;
}

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

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

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

[全局变量

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

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

同样,它的生命周期只在程序结束时才结束。

示例 2:全局变量

#include <iostream>
using namespace std;

// 全局变量声明
int c = 12;

void test();

int main()
{
++c;

// 输出 13
cout << c <<endl;
test();

return 0;
}

void test()
{
++c;

// 输出 14
cout << c;
}

输出

13
14

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

这个变量对程序中的 main()test() 两个函数都是可见的。

静态局部变量

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

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

静态局部变量仅存在于声明它的函数内(类似于局部变量),但其生命周期从函数调用开始,直到程序结束才结束。

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

示例 3:静态局部变量

#include <iostream>
using namespace std;

void test()
{
// var 是静态变量
static int var = 0;
++var;

cout << var << endl;
}

int main()
{

test();
test();

return 0;
}

输出

1
2

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

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

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

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

如果 var 没有指定为静态变量,上述程序的输出

1
1

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

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

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

如果程序遇到寄存器变量,且有可用的处理器寄存器,它会将变量存储在处理器的寄存器而不是内存中。这使得它比局部变量更快。

然而,这个关键字在 C++11 中已被弃用,不应该使用。

[线程本地存储

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

关键字 thread_local 用于此目的。

了解更多关于线程本地存储