跨编译单元之初始化次序
所谓static对象,其寿命从被构造出来直到程序结束为止,因此
stack和heap-based对象都被排除。这种对象包括global对象,定
义于namespace作用域内的对象、在class内、在函数内、以及在
file作用域内被声明为static的对象。函数内的static对象称为
local static对象(因为它们对函数而言是local),其他static
对象称为non-local static对象。程序结束时static对象会被自动
销毁,也就是它们的析构函数会在main()结束时被自动调用。
所谓编译单元(translation unit)是指产出单一目标文件
(single object file)的那些源码。基本上它是单一源码文件加
上其所含入的头文件。
C++对“定义于不同编译单元内的non-local static对象”的初始
化次序并无明确定义。
问题来了:如果某编译单元内的某个non-local static对象的初始
化动作使用了另一个编译单元内的某个non-local static对象,它
所用到的这个对象可能尚未被初始化。
解决方法:
将每个non-local static对象搬到自己的专属函数内(该对象在此
函数内被声明为static)。这些函数返回一个reference指向它所
含的对象。然后用户调用这些函数,而不直接指涉这些对象。这个
专属函数我们叫它reference-returning函数。其形式大致为:
class classNameA
{
...
};
class classNameB
{
...
inline classNameA& clsNameAObj()
{
static classNameA clsNameA;
return clsNameA;
}
...
}
这个方法的基础在于:C++保证,函数内的local static对象会在
“该函数被调用期间”“首次遇上该对象之定义式”时被初始化。
但从另一个角度看,这些函数“内含static对象”的事实使他们在
多线程系统中带有不确定性。我们可以在程序的单线程启动阶段手
工调用所有reference-returning函数,这可消除与初始化有关的
“竞速形式(race conditions)”。
我们总是需要为内置型对象进行手工初始化,因为C++不保证初始化他们。
转载于:https://blog.51cto.com/coolbreezex/1334071
跨编译单元之初始化次序相关推荐
- C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间...
转 自:http://www.cnblogs.com/rocketfan/archive/2009/10/02/1577361.html 1. 编译单元:一个.cc或.cpp文件作为一个编译单元,生成 ...
- Android编译系统环境过程初始化分析【转】
本文转载自:http://blog.csdn.net/luoshengyang/article/details/18928789 Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就 ...
- C++编译单元 内部链接 外部链接
文章目录 编译单元 内部链接 外部链接简单解释 代码解释 外部链接 内部链接 C++ 中的内部链接 和外部链接 类型 编译单元 内部链接 外部链接简单解释 这是一个最简单最表面的解释,深入的解释应该要 ...
- $unit编译单元声明
$unit编译单元声明 SystemVerilog含有编译单元. 相比Verilog,SystemVerilog增加了编译单元的概念.编译单元是同时编译的所有源文件.编译单元为软件工具提供了一种对整个 ...
- 资源不在java项目和构建路径上_编译单元不在Java项目的构建路径上-Maven
今天,我已经在日食中导入了一个Maven项目.当我尝试自动建议时,当我添加一些代码时,它提示我"编译单元不在Java项目的构建路径上".我没有看到解决此问题的方法,但是都没有解决. ...
- 编译单元必须以 java_java中什么是编译单元
Java中的编译单元 当编写一个Java源代码文件时,此文件以.java结尾,被称为编译单元. 1. 编译单元中可以有一个public类,且只能有一个public类,作为外界访问该类的接口,该类的名称 ...
- java lib 不在构建路径里面问题_svn - Eclipse“这个编译单元不在java项目的构建路径上”...
svn - Eclipse"这个编译单元不在java项目的构建路径上" 我无法在Eclipse上使用自动完成功能. 我正在研究svn上的项目. 我通过进入Eclipse在Eclip ...
- 不同编译单元内的非局部静态对象的初始化次序问题
我们采用一个专属函数,代替非局部静态对象,实现方式: T& tps() { static T tps return tps; } 但这种方式,在多线程中,有一定的不确定性,必须要在程序单线程启 ...
- Python与Ansys apdl有限元系列三:单层单跨梁单元受竖向均布力,水平集中力
结构工况 ################################ # Author: GuaDiKaoLa # Email: 582392629@qq.com ############### ...
最新文章
- 懂你,从选择内裤开始
- 144. Binary Tree Preorder Traversal
- MyBatis1:MyBatis入门
- NetCat Tutorials
- 暑期训练日志----2018.8.9
- 软件测试之-------软件缺陷
- 高等组合学笔记(十): 分拆数恒等式, 分拆函数同余性质
- (转)SpringMVC学习(二)——SpringMVC架构及组件
- python求三个整数最大值_python 练习题:定义一个getMax()函数,返回三个数(从键盘输入的整数)中的最大值。...
- ubuntu 下 升级 nginx
- hbase 实战项目
- Android屏幕适配(SmallestWidth适配 sw限定符)最新步骤解析
- 二进制算法——模二运算
- 软考-中级-网络工程师-知识点个人总结(三)
- Python Decorator 的来龙
- 语音识别-食物声音识别
- 用户名第一个字符设置为默认头像
- Html之 图像标记
- C#将ip地址转换成长整形数字的代码
- superset:自定义标签乱码解决