C++ 存储周期

存储类说明符

auto(块作用域内,自动分配和销毁)

register

static(静态线程存储期和内部链接

extern(静态线程存储期和内部链接

thread_local(线程存储期

mutable(不影响存储期或链接。

解释

1) auto 说明符只能搭配在块作用域或函数形参列表中声明的对象。它指示自动存储期,即这种声明的默认情况。此关键词的含义在 C++11 有变更。

(C++11 前)

2) register 说明符只能搭配在块作用域或函数形参列表中声明的对象。它指示自动存储期,即这种声明的默认情况。另外,此关键词的存在可以用来提示优化器将此变量的值存储到 CPU 寄存器。此关键词已经被弃用。

(C++17 前)

3) static 说明符只能搭配(函数形参列表外的)对象声明、(块作用域外的)函数声明及匿名联合体声明。当用于声明类成员时,它会声明一个静态成员。当用于声明对象时,它指定静态存储期(除非与 thread_local 协同出现)。在命名空间作用域内声明时,它指定内部链接。

4) extern 声明符只能搭配变量声明和函数声明(除了类成员或函数形参)。它指定外部链接,而且技术上不影响存储期,但它不能用来定义自动存储期的对象,故所有 extern 对象都具有静态或线程存储期。另外,使用 extern 且没有初始化器的声明不是定义

5) thread_local 关键词只能搭配在命名空间作用域声明的对象、在块作用域声明的对象及静态数据成员。它指示对象具有线程存储期。如果对块作用域变量只应用了 thread_local 这一个存储类说明符,那么同时也意味着应用了 static。它能与 static 或 extern 结合,以分别指定内部或外部链接(但静态数据成员始终拥有外部链接)。

存储期

程序中的所有对象都具有下列存储期之一:

  • 自动(automatic)存储期。这类对象的存储在外围代码块开始时分配,并在结束时解分配。未声明为 staticextern 或 thread_local 的所有局部对象均拥有此存储期。
  • 静态(static)存储期。这类对象的存储在程序开始时分配,并在程序结束时解分配。这类对象只存在一个实例。所有在命名空间(包含全局命名空间)作用域声明的对象,加上声明带有 static 或 extern 的对象均拥有此存储期。有关拥有此存储期的对象的初始化的细节,见非局部变量静态局部变量
  • 线程(thread)存储期。这类对象的存储在线程开始时分配,并在线程结束时解分配。每个线程拥有它自身的对象实例。只有声明为 thread_local 的对象拥有此存储期。thread_local 能与 static 或 extern 一同出现,它们用于调整链接。关于具有此存储期的对象的初始化的细节,见非局部变量静态局部变量
(C++11 起)
  • 动态(dynamic)存储期。这类对象的存储是通过使用动态内存分配函数来按请求进行分配和解分配的。关于具有此存储期的对象的初始化的细节,见 new 表达式

引用

存储类说明符 - cppreference.com

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值