C++非局部变量生命期

本文详细探讨了C++中非局部变量的生命周期,包括静态存储期(SSD)和线程存储期(TSD)对象的初始化和终止。非局部变量的初始化分为静态初始化和动态初始化,动态初始化可能涉及运行时计算。全局变量、类静态成员变量以及函数局部静态变量的初始化各有特点,并且初始化顺序可能存在不确定性。非局部变量的析构过程相对简单,SSD变量在main函数返回或exit调用时析构,TSD变量在相应线程结束时析构。
摘要由CSDN通过智能技术生成

非局部变量(non-local variable)的生命期(lifetime/lifecycle)是C++语言的一个阴暗角落,隐藏着很多细节问题。由于C++11新加了线程支持,非局部变量从存储特性上分为static storage duration和thread storage duration两类。SSD对象的初始化和终止化伴随程序初始化和终止发生,TSD对象的初始化和终止化伴随线程的执行和退出发生(程序或线程的初始化/终止化是因,变量的初始化/终止化是果)。

非局部变量的初始化分为静态初始化和动态初始化两个阶段。其中静态初始化包括零初始化和可能的常量初始化(C++11引入了常量表达式,扩大了常量初始化的范畴)。所谓动态初始化是指除了零初始化和常量初始化之外的任何初始化。一般而言动态初始化需要运行期进行计算。

所有非局部变量都有零初始化过程。而是否有常量初始化和动态初始化则视非局部变量的初始化器而定。C++语言保证静态初始化一定在动态初始化开始之前完成,而且零初始化一定在任何其它初始化之前完成。这一保证是对所有非局部变量而言,即所有零初始化都完成之后才会对需要常量初始化的对象执行常量初始化,然后再对需要动态初始化的对象执行动态初始化。由于用户代码获得控制权要么是通过main函数要么是通过动态初始化,不论如何,用户代码得以运行时静态初始化都已完成。

static int kZero;            // zero-initialization
static int kOne = 1;         // zero-initialization, constant initialization
static int* kVar = new int(2); // zero-initialization, dynamic initializati
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值