2014-07-03 77 views
7

我想在主线程上初始化一些静态数据。如果功能有副作用,功能可以优化吗?

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

我对编写编译器的人员足够聪明,不会因为抛弃了他们的返回值而抛弃带有副作用的函数调用而持谨慎乐观的态度。 – meagar

+0

我想欣赏标准的一些相关部分。 – Sam

+1

如果您的目的是为了避免竞争条件(如源代码注释所述),则不需要首次调用。 C++ 11保证本地静态变量初始化没有竞争条件(标准的以前版本没有关于线程)。 – Eugene

回答

4

编译器必须按照“为假设”规则进行优化。也就是说,在任何优化之后,程序仍然必须表现(在逻辑意义上),就好像代码没有被优化一样。

如果对功能有副作用,任何优化都必须保留副作用。但是,如果编译器可以确定副作用的结果不会影响程序的其余部分,那么它甚至可以优化副作用。编译器对这个领域非常保守。如果您的编译器优化了HugeBarData构造函数或Baz调用的副作用,这是程序中其他位置所需的,那么这是编译器中的一个错误。

有一些例外情况,编译器可以进行优化,这些优化会改变未优化的情况下的程序行为,通常涉及副本。我认为这些例外都不适用于此。