non-local static对象初始化顺序

本文探讨了C++中non-local static对象的初始化顺序问题,由于编译器未明确定义,可能导致初始化顺序不确定,从而带来未定义的行为。通过举例说明了这个问题,并提出利用local static对象作为解决方案,以确保正确初始化并避免潜在问题。
摘要由CSDN通过智能技术生成

non-local static对象

什么是non-local?,non-local这个术语其实是我在effective c++这本书中学到的术语,这个术语指的是非函数局部局部用域内的.那么non-local static对象有指的是什么呢?,其实说到static(不是指static关键字定义的对象)对象,至少可以排除那些内存是在堆中和栈中的对象了,所谓static对象指的是内存在data段和bss段中的对象.这类对象在整个程序的生命周期内都是存在的,除非程序结束否则会一直存在,利用static关键字声明的对象是static对象中的一种,但是如果是在函数内部定义的static对象,那么这种static对象被称为local static对象,除此之外的则是non-local static对象 比如:global作用域内的static对象,namespace作用域内的static对象,类作用域内使用static关键字声明的对象,file作用域内的static对象等.到此为止我相信我应该是把non-local static对象的含义解释清楚了吧.

为什么谈这个话题

其实我也是个C++的小白,自己在读书的过程中喜欢把自己不理解的,或者比较有意思的,很重要的知识点,通过实践和总结写成博客,其实这篇博客的主题就来自于effective C++(from item 4).为何这个话题我觉得重要呢,其实C++难学其中有一个原因我认为是C++中存在很多无明确定义的地方.本文就是其中一个.在C++中对于定义在不同编译单元内的non-local static对象其初始化相对次序是无明确的定义的.主要原因是在于决定它们的初始化次序相当困难,非常困难,或者说根本无解,至于为什么其实我也不清楚,这是那些搞编译器的人需要做的事情.占且我们认为这是一个未解决的bug吧.先来解释下编译单元这个术语的含义吧,编译单元在这里指的的要进行编译的.cpp文件,一个.cpp文件就是一个编译单元. 如果在一个场景中,在两个不同的编译单元中存在两个static变量,并且其中一个static变量利用另外一个进行了初始化.那么很显然这是未定义的.因为两个static对象的初始化顺序是未定义的.为了更加直观,下面例举一个例子,如下:

first.cpp文件

#include <iostre
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值