美文网首页
C++中如何指定全局对象的初始化顺序

C++中如何指定全局对象的初始化顺序

作者: 天一阁图书管理员 | 来源:发表于2017-03-14 10:53 被阅读196次

这个问题出现在,程序里有一个数据库对象,是被全局依赖的,刚开始的时候程序比较简单。后来程序变复杂了,有多个全局对象依赖它。那么问题来了,我能不能让它们自动按顺序初始化?

1.首先从简单的情况看看,最简单的了,就是这样子,还是用代码来演示吧:

#include<cstdio>
using namespace std;
class A
{
public:
      A(int id):id(id) { 
            printf("A::A(),id=%d\n", id);
       }
      ~A() { 
             printf("A::~A(),id=%d\n", id); 
        }
private: 
         int id;
};


A a1(1);
A a2(2);
int main()
{
     A a(3);  
     return 0;
}

执行后得到:

A::A(),id=1
A::A(),id=2
A::A(),id=3
A::~A(),id=3
A::~A(),id=2
A::~A(),id=1

从gcc的表现来看,在单个文件里,全局对象的初始化是按出现的顺序来的。

2.在上面的基础上,将全局对象分布到不同的文件里看看会怎么样

cpp1

#include "ck.h"
using namespace std;

A a1(1);
A a4(4);
int main()
{
   A a(3);
   return 0;
}

cpp2

#include "ck.h"
A a2(2);
A a5(5);

ck.h

#include<cstdio>
using namespace std;
class A
{
public:
  A(int id):id(id) { 
        printf("A::A(),id=%d\n", id); 
    }
  ~A() { 
        printf("A::~A(),id=%d\n",id);
     }
private:  
        int id;
};

编译执行得到的结果是:

A::A(),id=2
A::A(),id=5
A::A(),id=1
A::A(),id=4
A::A(),id=3
A::~A(),id=3
A::~A(),id=4
A::~A(),id=1
A::~A(),id=5
A::~A(),id=2

看不出有什么顺序?或者本来就是乱序?但还是能够看出来,同一个文件里的全局对象是按顺序的,不同文件的就很难说了。

3.能不能不要猜?或者说强制指定编译顺序?

gcc提供了一个特性,利用它可以指定对象的初始化优先级,例如

Some_Class  A  __attribute__ ((init_priority (2000)));
Some_Class  B  __attribute__ ((init_priority (543)));

利用它我们可以达到自己想要的目的,将上面的代码修改为:

A a1  __attribute__ ((init_priority (1000))) (1);
A a4  __attribute__ ((init_priority (4000))) (4);

A a2 __attribute__ ((init_priority (2000))) (2);
A a5 __attribute__ ((init_priority (5000))) (5);

执行得到的结果为:

A::A(),id=1
A::A(),id=2
A::A(),id=4
A::A(),id=5
A::A(),id=3
A::~A(),id=3
A::~A(),id=5
A::~A(),id=4
A::~A(),id=2
A::~A(),id=1

经过验证,使用init_priority确实能够达到我想要的效果。

4.代码级解决方案

如果觉得编译器的方案也不是很完善,不能自己把握全局,那就自己写一个管理器,在管理器里对各个对象进行顺序初始化。这里的代码我就不演示了。

5.总结:最好不要用全局对象,即使用了全局对象,初始化的时候也最好放在一个文件里。如果一定要用全局对象,需要注意全局对象的初始化顺序依赖问题。

相关文章

  • C++中如何指定全局对象的初始化顺序

    这个问题出现在,程序里有一个数据库对象,是被全局依赖的,刚开始的时候程序比较简单。后来程序变复杂了,有多个全局对象...

  • 超轻量操作系统OneOS-Lite对C++的支持

    简介 c++组件是为了支持编译c++源文件。该组件把全局对象的构造函数放到了指定的段地址中,以支撑c++的正常使用...

  • C++静态变量的初始化

    C++静态变量的初始化 摘要 在开发中经常会有一些全局的静态的对象,譬如logHandler,这些全局对象的使用可...

  • C++之对象的销毁

    生活中对象都是被初始化后才上市的 生活中的对象被销毁前会做一些工作 问题1 : C++中如何清理需要销毁的对象? ...

  • C++二义性 多态 纯虚函数 模版函数

    1.C++源码中对象初始化方式 std::string 对char *的封装 C++源码中对象初始化 2.虚继承 ...

  • 初始化

    成员方法的初始化 在类的内部,变量的定义顺序决定了初始化的顺序。创建一个对象时,会先初始化对象中的成员变量,然后才...

  • 调整驱动加载顺序

    Linux内核驱动程序初始化顺序的调整(1) 如何调整Linux内核启动中的驱动初始化顺序

  • windows逆向3

    VC 程序内存和编译的一些特征C++ 构造函数C++ 成员函数C++ 析构函数C++ 全局对象的构造C++ 全局对...

  • 成员初始化列表

    C++为类中提供类成员的初始化列表 类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数...

  • C++中对象构造顺序

    单个对象的构造与析构 单个对象创建时构造函数的调用顺序1、调用父类的构造过程2、调用成员变量的构造函数(调用顺序与...

网友评论

      本文标题:C++中如何指定全局对象的初始化顺序

      本文链接:https://www.haomeiwen.com/subject/arbcnttx.html