博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
非局部静态数据在多编译单元中的窘境
阅读量:6255 次
发布时间:2019-06-22

本文共 1374 字,大约阅读时间需要 4 分钟。

非局部静态数据在多编译单元中的窘境

标题有点拗口,先来解释一下。

静态数据包括:

  1. 在namespace内定义的名字空间域变量 √
  2. 在类中被声明为static的类域变量 √
  3. 在函数中被声明为static的局部静态变量 ×
  4. 在文件中被定义的全局变量(不管有没有static修饰) √

上面提到的非局部静态数据指的就是除去第3种情形之外,其他的1、2、4情形。

而编译单元指的就是.o文件,假如一个工程是由n个单独的cpp和对应的头文件,那么就会被事先编译生成n个.o文件,有时候我们将这些*.o文件称为目标文件,它们作为生成最后的统一可执行文件,也被称为编译单元。

综上所言,本文的标题的含义是:如果在多文件中,分别定义了多个静态数据(不含局部变量),那么他们之间的相互依赖关系将会出现微妙的窘境。

什么窘境呢?事情是这样的,由于静态数据会在程序运行开始时刻进行初始化(不管是指定初始化,还是系统自动初始化),并且C++标准没有规定多个文件中的这些静态数据的初始化次序,这就会带来一个问题:如果非局部静态数据相互依赖,那就会因为初始化次序的不确定性,导致程序的运行结果无法预测。

比如,程序员Jack开发了一个超好用的类,叫car(汽车),并定义了一个此类的对象预备给他人使用。

class car  // 非开源代码{    ... ...public:    void startup(params);    ... ...};extern car BMW; // 一台高性能汽车 ^__^

另一方面,在不同的时间不同的地点,不同的程序员Rose基于不同的目的,开发了一个物流类MF,很自然地会直接使用Jack的汽车对象来完成某些工作。

class MF{public:    MF(params);    ... ...};MF::MF(params){    ... ...    BMW.startup();  // 使用car对象}

很快,Rose的代码便会遇到灾难性的后果,因为C++编译时无法保证在MF对象初始化之时,汽车对象BMW究竟有没有初始化完毕。因此,MF很有可能调用了一个未初始化对象的startup函数,这很尴尬。


避免这种情况做法也很简单,那就是定义一个函数,专门用来处理这些引发麻烦的多编译单元里的非局部静态数据。比如:

car &BMW(){    static car c; // 局部静态对象c    return c;}此时,Rose使用car对象的情形只需要一个小小小小的改动:MF::MF(params){    ... ...    BMW().startup();  // 使用car对象}

没错,就是在BMW的后面加了一对括号。整体而言,用户Rose在使用car对象的过程是完全一样的,但程序的逻辑大有不同,当Rose首次调用函数BMW的时候,局部静态对象c被创建并初始化,这保证了调用startup()函数的正确性,其次,如果startup()一次都没被调用过,那么局部静态对象c根本就不会被产生!完美!

通过这样的设计,我们反手一勾拳同时解决了两个问题:既保证了初始化的次序,由提高了程序的性能。

识别下面二维码,进入 微店●秘籍酷 逛逛吧!

非局部静态数据在多编译单元中的窘境

转载于:https://blog.51cto.com/vincent040/2050028

你可能感兴趣的文章
[Windows 8小技巧]如何让Windows 8不显示锁屏画面
查看>>
3月15日 打卡
查看>>
apache 日志分析工具(webalizer、awstats)的使用
查看>>
我的友情链接
查看>>
sql server数据库备份语句
查看>>
oracle 安装过程
查看>>
Tcpdump使用
查看>>
使用gitlab实现上线自动化
查看>>
centos6.5上安装ncdu
查看>>
Java中Overload和Override的区别
查看>>
基于VMware vSphere 5.0的服务器虚拟化实践(3)
查看>>
Redhat Linux NFS配置
查看>>
我的友情链接
查看>>
QDirModel使用QSortFilterProxyModel过滤指定磁盘和非系统盘
查看>>
主机连接虚拟机 web服务
查看>>
smarty 模板编译和变量调节器 模板引入
查看>>
【java集合框架源码剖析系列】java源码剖析之TreeMap
查看>>
【学习笔记】Python编程
查看>>
超链接与图像
查看>>
19年PDYZ冬令营游记
查看>>