本教程将向您介绍 C++ 中的各种存储类。主要有五种类型:局部、全局、静态局部、寄存器和线程局部。
在 C++ 中,每个变量都有两个属性:类型和存储类。指定了可以在变量中存储的数据类型。例如,int、float、char 等。除此之外,存储类还控制两个不同的变量属性,如生命周期(变量可以存在的时间长度)和作用域(决定程序哪个部分可以访问它)。
在 C++ 程序中,存储类用于定义变量和/或函数的生命周期和可见性。变量的生命周期是它活动的时间量,其可见性是程序中它可以访问的模块。
根据其存储类,变量可以分为四种主要类型:
局部变量,也称为自动变量,是在函数内部定义的变量(它将在函数体内大括号之间定义)。它的作用域仅限于定义它的函数。这意味着局部变量只存在于函数内部并只能在函数内部访问。当函数退出时,局部变量的生命周期结束(它被销毁)。
#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 有了新的含义,不应再用于定义局部变量。
当变量在所有函数外部定义时,它被称为全局变量。全局变量的作用域是整个程序。这意味着它在声明后可以在程序的任何地方使用和更改。
同样,它的存在仅在程序终止或结束时结束。
#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() 函数都可见。
静态变量使用关键字 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
寄存器变量使用关键字 register 指定。寄存器变量,像自动变量一样,只存在于单个函数中。它需要比局部变量更快。
当程序遇到寄存器变量时,如果内存可用,它会将其存储在处理器的寄存器中而不是内存中。因此,它比局部变量更快。然而,这个关键字在 C++11 中已弃用,不应再使用。
线程局部存储是一种分配变量的机制,以便每个线程都有一个变量实例。为此,使用关键字 thread_local。
C++ 程序中可以使用五种不同类型的存储类。

它是所有局部变量的默认存储类。auto 关键字会自动应用于所有局部变量。
{
auto int y;
float y = 3.45;
}
在上面的示例中,定义了两个具有相同存储类的变量;auto 只能在函数内部使用。
寄存器变量将内存存储在寄存器中而不是 RAM 中。其大小与寄存器大小相同。它可以比其他变量更快地访问。
建议您只将寄存器变量用于快速访问,例如在计数器中。
注意 :我们无法获取寄存器变量的地址。
register int counter=0;
静态变量只初始化一次,并一直存在直到程序终止。即使多次调用函数,它也保留其值。编译器为静态变量提供默认值 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