繁体   English   中英

强制在某个静态字段之前初始化全局变量

[英]force a global variable to be initialized before a certain static field

我想在静态字段(#B)初始化之前调用全局变量的初始化(#A)。

目前,一些静态字段在全局变量之前初始化。

GridUtil.h

class GridUtil{
   static Vec4* bPtr_;  //will be filled
   static void initGridCalculationCache();
   static class _init   //helper class
    {
        public:
        _init() { 
        static_iniAll(); 
        }
    } _initializer;

}

GridUtil.cpp

#include "GridUtil.h"
GridUtil::_init GridUtil::_initializer;// (Edit: This line is just added, thank Dietmar Kühl.)
Vec4 b[24];                      //#A executed 3rd : No, this should be the first.
Vec4* GridUtil::bPtr_=b;         //#B executed 1st
void GridUtil::initGridCalculationCache() {
    //.... fill GridUtil::bPtr_ using complex computation //#C executed 2nd
}

结果

从调试开始,上述代码的执行顺序为: -

B->C->A

但我想要 :-

A->B->C

我注意到如果“Vec4”被“int”替换,执行顺序将是: -

A->B->C

目标是使用将自动调用的静态函数(initGridCalculationCache)设置数组中元素的值(bPtr_)(由类_init帮助)。

如果不可能,那么正确的方法是什么?

按优先顺序排列的四个明显的解决方案是:

  1. 没有全局或static成员变量可以开始! 这些往往会产生大量问题,在使用并发的系统中会更加严重。
  2. 使用constexpr对象,因为这些对象在编译期间被初始化。 显然,对可以做什么有一些限制,但编译器会验证对象是否按正确顺序初始化。
  3. 在翻译单元中,具有静态实时时间的对象从上到下进行初始化。 也就是说,如果变量定义可以达到所需的顺序,则使用正确的顺序。 但是,没有可移植的方法来命令跨翻译单元进行可变的初始化。
  4. 当依赖于来自不同翻译单元的对象之间的初始化时,可以使用返回引用的函数本地static对象来保证正确的顺序:这些将在首次访问时构造。

顺序相当简单,POD通过将它们从二进制文件的.DATA部分复制到RAM来初始化。 类在运行时由其ctor初始化。 因此,只要它们处于相同的静态区域,POD将始终被初始化为任何具有ctor的类。 如果你使用DLL / SO一切都很有趣。

初始化顺序未定义。 没有任何保证。 如果您明确需要特殊订单,请在init函数中初始化静态变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM