所谓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

跨编译单元之初始化次序相关推荐

  1. C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间...

    转 自:http://www.cnblogs.com/rocketfan/archive/2009/10/02/1577361.html 1. 编译单元:一个.cc或.cpp文件作为一个编译单元,生成 ...

  2. Android编译系统环境过程初始化分析【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/18928789 Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就 ...

  3. C++编译单元 内部链接 外部链接

    文章目录 编译单元 内部链接 外部链接简单解释 代码解释 外部链接 内部链接 C++ 中的内部链接 和外部链接 类型 编译单元 内部链接 外部链接简单解释 这是一个最简单最表面的解释,深入的解释应该要 ...

  4. $unit编译单元声明

    $unit编译单元声明 SystemVerilog含有编译单元. 相比Verilog,SystemVerilog增加了编译单元的概念.编译单元是同时编译的所有源文件.编译单元为软件工具提供了一种对整个 ...

  5. 资源不在java项目和构建路径上_编译单元不在Java项目的构建路径上-Maven

    今天,我已经在日食中导入了一个Maven项目.当我尝试自动建议时,当我添加一些代码时,它提示我"编译单元不在Java项目的构建路径上".我没有看到解决此问题的方法,但是都没有解决. ...

  6. 编译单元必须以 java_java中什么是编译单元

    Java中的编译单元 当编写一个Java源代码文件时,此文件以.java结尾,被称为编译单元. 1. 编译单元中可以有一个public类,且只能有一个public类,作为外界访问该类的接口,该类的名称 ...

  7. java lib 不在构建路径里面问题_svn - Eclipse“这个编译单元不在java项目的构建路径上”...

    svn - Eclipse"这个编译单元不在java项目的构建路径上" 我无法在Eclipse上使用自动完成功能. 我正在研究svn上的项目. 我通过进入Eclipse在Eclip ...

  8. 不同编译单元内的非局部静态对象的初始化次序问题

    我们采用一个专属函数,代替非局部静态对象,实现方式: T& tps() { static T tps return tps; } 但这种方式,在多线程中,有一定的不确定性,必须要在程序单线程启 ...

  9. Python与Ansys apdl有限元系列三:单层单跨梁单元受竖向均布力,水平集中力

    结构工况 ################################ # Author: GuaDiKaoLa # Email: 582392629@qq.com ############### ...

最新文章

  1. 懂你,从选择内裤开始
  2. 144. Binary Tree Preorder Traversal
  3. MyBatis1:MyBatis入门
  4. NetCat Tutorials
  5. 暑期训练日志----2018.8.9
  6. 软件测试之-------软件缺陷
  7. 高等组合学笔记(十): 分拆数恒等式, 分拆函数同余性质
  8. (转)SpringMVC学习(二)——SpringMVC架构及组件
  9. python求三个整数最大值_python 练习题:定义一个getMax()函数,返回三个数(从键盘输入的整数)中的最大值。...
  10. ubuntu 下 升级 nginx
  11. hbase 实战项目
  12. Android屏幕适配(SmallestWidth适配 sw限定符)最新步骤解析
  13. 二进制算法——模二运算
  14. 软考-中级-网络工程师-知识点个人总结(三)
  15. Python Decorator 的来龙
  16. 语音识别-食物声音识别
  17. 用户名第一个字符设置为默认头像
  18. Html之 图像标记
  19. C#将ip地址转换成长整形数字的代码
  20. superset:自定义标签乱码解决

热门文章

  1. gbdt 回归 特征重要性 排序_GBDT 理解
  2. 我爱Java系列---【mysql基础约束】
  3. 根据痛点分析制作软件
  4. java 重定向和转发 的区别
  5. Bootstrap部分---环境安装及一个可视化的布局;
  6. Android进程保活
  7. 解决mantis不能上传附件问题
  8. 【软件】chrome设置默认字体
  9. 临时对象与NRV技术
  10. tableView的plain样式的headerView的上拉过程中悬停解决方法