我想在主线程上初始化一些静态数据。
int32_t GetFoo(ptime t)
{
static HugeBarData data;
return data.Baz(t);
}
int main()
{
GetFoo(); // Avoid data race on static field.
// But will it be optimized away as unnecessary?
// Spawn threads. Call 'GetFoo' on the threads.
}
如果编制者可能决定删除它,我怎么能强迫它留在那里?
答案 0 :(得分:6)
C ++编译器可以优化的唯一副作用函数是不必要的构造函数调用,尤其是复制构造函数。
Cf Under what conditions does C++ optimize out constructor calls?
答案 1 :(得分:4)
编译器必须根据“as-if”规则进行优化。也就是说,在进行任何优化之后,程序仍然必须(在逻辑意义上)表现得好像代码没有被优化一样。
如果对功能有副作用,任何优化都必须保留副作用。但是,如果编译器可以确定副作用的结果不影响程序的其余部分,它甚至可以优化副作用。编译器对此领域非常保守。如果你的编译器优化了程序中其他地方所需的HugeBarData构造函数或Baz调用的副作用,那么这就是编译器中的一个错误。
有一些例外情况,编译器可以进行优化,改变程序从非优化情况中的行为,通常涉及副本。我不认为这些例外适用于此。