我想在静态字段(#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帮助)。
如果不可能,那么正确的方法是什么?
答案 0 :(得分:3)
按优先顺序排列的四个明显的解决方案是:
static
成员变量!在使用并发的系统中,这些问题往往会产生大量问题。constexpr
个对象,因为这些对象在编译期间被初始化。显然,对可以做什么有一些限制,但编译器会验证对象是否以正确的顺序初始化。static
对象来保证正确的顺序:这些将在首次访问时构建。答案 1 :(得分:0)
顺序相当简单,POD通过将它们从二进制文件的.DATA部分复制到RAM来初始化。类在运行时由其ctor初始化。因此,只要它们处于相同的静态区域,POD将始终被初始化为任何具有ctor的类。如果您使用DLL / SO,一切都会变得有趣。
初始化顺序未定义。没有任何保证。如果您明确需要特殊订单,请在init函数中初始化静态变量。