目录
1. 自动存储类(Automatic Storage Class)
2. 静态存储类(Static Storage Class)
3. 外部存储类(External Storage Class)
4. 线程局部存储类(Thread Local Storage Class)
在 C++ 中,存储类(storage class)也称为存储类型(storage type),用于描述变量的生存期(lifetime)和可见性(visibility)。存储类决定了变量何时被创建、何时被销毁以及在何处可以访问。C++ 支持以下几种存储类:
1. 自动存储类(Automatic Storage Class)
auto
和 register
-
auto
:从 C++11 开始,auto
关键字用于自动推断变量的类型。auto
本身并不是一个存储类,但它可以与局部变量一起使用,以简化类型声明。深色版本
auto x = 10; // 类型为 int
-
register
:register
关键字建议编译器将变量存储在寄存器中,以加快访问速度。然而,在现代编译器中,是否使用寄存器由编译器决定,register
更多地是一个提示而非强制要求。深色版本
register int regVar = 10; // 建议存储在寄存器中
2. 静态存储类(Static Storage Class)
static
static
关键字用于指定变量具有静态存储持续期,即在整个程序执行期间都存在。根据变量声明的位置,static
可以有不同的含义:
-
局部变量:在函数内部声明的
static
变量在整个程序执行期间存在,即使函数退出后也不会被销毁。深色版本
void func() { static int count = 0; count++; std::cout << "Count: " << count << std::endl; }
-
全局变量:在文件范围内声明的
static
变量只能在声明它的文件内部访问。深色版本
static int globalVar = 10;
3. 外部存储类(External Storage Class)
extern
extern
关键字用于声明一个变量或函数是在其他地方定义的。通常用于在多个源文件之间共享变量或函数。
示例:
假设你有两个源文件 main.cpp
和 util.h
。
util.h:
cpp
深色版本
extern int globalVar;
util.cpp:
cpp
深色版本
int globalVar = 100;
main.cpp:
cpp
深色版本
#include <iostream>
#include "util.h"
using namespace std;
int main() {
cout << "Global variable: " << globalVar << endl; // 访问定义在 util.cpp 中的 globalVar
return 0;
}
4. 线程局部存储类(Thread Local Storage Class)
thread_local
thread_local
关键字用于声明一个变量在线程内的本地存储。这意味着每个线程都有自己的副本。
示例:
cpp
深色版本
#include <iostream>
#include <thread>
using namespace std;
thread_local int threadVar = 0;
void increment() {
threadVar++;
cout << "ThreadVar: " << threadVar << endl;
}
int main() {
thread t1(increment);
thread t2(increment);
t1.join();
t2.join();
return 0;
}
总结
存储类在 C++ 中用于描述变量的生存期和可见性,正确使用存储类可以帮助你更好地控制变量的作用域、生命周期以及内存管理。以下是 C++ 中常见的存储类及其特点:
auto
:用于自动推断类型,不是存储类。register
:建议编译器将变量存储在寄存器中。static
:指定变量具有静态存储持续期,可以用于局部变量和全局变量。extern
:声明变量或函数在其他地方定义。thread_local
:指定变量在线程内的本地存储。
通过合理使用这些存储类,你可以编写出更清晰、更安全、更高效的 C++ 程序。随着编程经验的积累,你会更加熟练地运用这些概念来优化你的代码结构。