在C++中,存储说明符(storage specifiers)是用于声明变量、函数或其他符号时,指定其存储属性的关键字。存储说明符影响变量的存储期限、链接性以及可见性。C++中的主要存储说明符包括:
- auto:
auto
是C++中局部变量的默认存储说明符。从C++11开始,auto
关键字被重新定义为自动类型推断的关键字,用于自动推导变量的类型。- 例如:
auto x = 42;
// 自动推导x的类型为int
- register:
register
建议编译器将变量存储在CPU寄存器中,以加快访问速度。然而,编译器可以忽略这个建议,因为它可能由于寄存器不足或其他原因无法将变量存储在寄存器中。- 例如:
register int fast_var;
// 建议将fast_var存储在寄存器中
- static:
static
用于声明具有静态存储期限的变量。对于局部变量,它使得变量在函数调用之间保持其值。对于全局变量,它使得变量具有内部链接性,即只在声明它的文件内可见。- 例如:
static int count = 0;
// 静态局部变量
- extern:
extern
用于声明在其他地方定义的全局变量。它使得变量具有外部链接性,即可以在多个文件之间共享。extern
也可以用于指定变量的存储说明符,但它本身不分配内存。- 例如:
extern int global_var;
// 声明在其他地方定义的全局变量
- mutable:
mutable
用于类的成员变量,它允许该成员变量即使在const成员函数中也能被修改。- 例如:
class MyClass { mutable int mutable_var; };
// 可在const成员函数中修改的成员变量
- thread_local(C++11及以后):
thread_local
用于声明线程局部存储(Thread-Local Storage, TLS)变量。每个线程都有其自己的变量副本,变量的生命周期与线程的生命周期相同。- 例如:
thread_local int tls_var;
// 线程局部存储变量
- volatile:
volatile
告诉编译器,变量的值可能会以不可预测的方式改变,例如通过硬件操作或者并发访问。这防止编译器对变量进行优化。- 例如:
volatile int irq_count;
// 可能被硬件中断修改的变量
这些存储说明符可以单独使用,也可以组合使用,以提供不同的存储属性和生命周期管理。正确使用存储说明符对于编写高效、正确的C++程序至关重要。