将下面的代码放在一个翻译单元中:
class C {
private:
struct Init {
Init() {
/* compute data once here */
}
};
static const Init& i;
static int data[];
public:
/* interface for reading data */
};
const C::Init& C::i = Init();
int C::data[200];发布于 2011-12-02 21:40:13
int C::data[200]为零初始化,这意味着它是静态初始化的.静态初始化先于动态初始化。因为C::Init::Init()不是一个常量表达式,所以C::i必须在C::data之后被动态初始化。
详情见3.6.2。
盗录的名言:
具有静态存储持续时间的
变量。在进行任何其他初始化之前,必须为零初始化。..。零初始化和常量初始化一起被称为静态初始化;所有其他初始化都是动态初始化.静态初始化应在进行任何动态初始化之前执行。
。
发布于 2011-12-02 21:41:54
C::data不是在那里初始化的,所以顺序并不重要。
较短的解决方案是使用静态函数和虚拟变量:
class C {
private:
static void Init() {
/* compute data once here */
}
static bool data_init_helper;
static int data[];
public:
/* interface for reading data */
};
bool C::data_init_helper = (C::Init(), false);
int C::data[200];发布于 2011-12-02 21:43:15
是C:我总是在C::数据之后初始化,无论两者的定义顺序如何?
如果它们是在同一个编译单元中定义的,则保证顺序,否则不会。
这个解决方案是计算静态数据的最优雅的解决方案吗?
不是的。如果您确实必须让它保持静态,那么更好的方法(并防止可能的静态初始化顺序失败)是这样做:
struct someDataStr
{
int data[200];
};
someDataStr& AccessData()
{
static someDataStr *ptr = NULL;
if ( NULL == ptr )
{
ptr = new someDataStr;
// initialize value
}
return *ptr;
}如果它不必是静态的,那么使用依赖注入,并将包含数据的对象传递给使用它的所有类。
https://stackoverflow.com/questions/8362921
复制相似问题