在计算机科学中,存储类是指用于定义变量或数据在内存中的存储方式和生命周期的类别,不同的存储类决定了变量的作用域、生命周期以及其在内存中的存储位置,以下是对常见存储类的详细解释:
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; |
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1490344.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复