当前位置:首页>行业动态> 正文

存储类详解,深入了解计算机存储机制与分类

存储类是计算机科学中用于定义变量的生命周期和访问权限的关键字,包括自动、寄存器、静态和外部等类型。

在计算机科学中,存储类是指用于定义变量或数据在内存中的存储方式和生命周期的类别,不同的存储类决定了变量的作用域、生命周期以及其在内存中的存储位置,以下是对常见存储类的详细解释:

1、自动存储类(auto):

作用域:函数内部或代码块内。

生命周期:当程序执行到声明该变量的代码块时,系统为该变量分配内存;当代码块执行完毕后,系统释放该内存。

存储位置:通常在栈上分配内存。

示例:

     void func() {
         int a = 10; // a是一个自动存储类的变量
     }

2、静态存储类(static):

作用域:函数内部或代码块内。

生命周期:在整个程序运行期间都存在,即使函数执行完毕也不会被销毁。

存储位置:通常在数据段分配内存。

示例:

     void func() {
         static int b = 20; // b是一个静态存储类的变量
     }

3、寄存器存储类(register):

作用域:函数内部或代码块内。

生命周期:与自动存储类相同,当代码块执行完毕后,系统释放该内存。

存储位置:尽量在CPU寄存器中分配内存,以提高访问速度,但由于寄存器数量有限,编译器可能无法总是满足这一要求。

示例:

     void func() {
         register int c = 30; // c是一个寄存器存储类的变量
     }

4、外部存储类(extern):

作用域:跨文件,用于声明在其他文件中定义的全局变量或函数。

生命周期:与全局存储类相同,在整个程序运行期间都存在。

存储位置:通常在数据段分配内存。

示例:

     // file1.c
     int d = 40; // d是一个外部存储类的变量
     // file2.c
     extern int d; // 声明d是一个外部存储类的变量

5、线程存储类(thread_local):

作用域:线程内部,每个线程都有自己的一份副本,互不影响。

生命周期:与线程的生命周期相同,当线程结束时,系统释放该内存。

存储位置:通常在线程的局部存储区分配内存。

示例:

     #include <thread>
     thread_local int e = 50; // e是一个线程存储类的变量

6、易失性存储类(volatile):

作用域:与自动存储类相同,函数内部或代码块内。

生命周期:与自动存储类相同,当代码块执行完毕后,系统释放该内存。

存储位置:与自动存储类相同,通常在栈上分配内存。

特性:告诉编译器该变量可能在任何时候被意外地改变,因此每次使用时都需要重新从内存中读取值,而不是使用寄存器中的副本,这通常用于硬件相关的编程,如中断服务例程等。

示例:

     void func() {
         volatile int f = 60; // f是一个易失性存储类的变量
     }

7、常量存储类(const):

作用域:与自动存储类相同,函数内部或代码块内。

生命周期:与自动存储类相同,当代码块执行完毕后,系统释放该内存。

存储位置:与自动存储类相同,通常在栈上分配内存。

特性:告诉编译器该变量的值在初始化后不能被修改,这有助于提高代码的安全性和可读性。

示例:

     void func() {
         const int g = 70; // g是一个常量存储类的变量
     }

表格归纳:

存储类作用域生命周期存储位置特性示例
auto函数内部或代码块内当代码块执行完毕后释放int a = 10;
static函数内部或代码块内整个程序运行期间都存在数据段静态变量static int b = 20;
register函数内部或代码块内当代码块执行完毕后释放CPU寄存器(尽量)提高访问速度register int c = 30;
extern跨文件整个程序运行期间都存在数据段跨文件引用extern int d;
thread_local线程内部与线程的生命周期相同线程的局部存储区每个线程都有自己的一份副本thread_local int e = 50;
volatile函数内部或代码块内当代码块执行完毕后释放可能在任何时候被意外地改变volatile int f = 60;