对静态本地数据进行延迟初始化

时间:2013-04-10 02:47:35

标签: c++ static factory lazy-initialization

我有以下代码(为简单起见省略了部分代码)

头:

class DbgModuleMarker
{
public:
    DbgModuleMarker( std::string name );

    static std::ostream createStream( const DbgModuleMarker& marker );

    std::ostream& operator()() const;

};

extern DbgModuleMarker PHYSICS;

源:

std::ostream& DbgModuleMarker::operator()() const
{
    static std::ostream os = createStream( *this );
    return os;
}

此代码的目标是允许operator()按如下方式使用

debug_modules::PHYSICS() << "Foo" << endl;

我真的不知道以这种方式调用函数时静态行为是什么。

我希望函数createStream只能调用一次(如果永远不调用operator(),则永远不会被调用

我想知道我期待的行为是否会发生,如果这是一个可能的想法,或者我做了一些非常错误而没有注意到它。

对线程安全和异常安全有什么影响?

(考虑创建的流本身就是线程安全的,因为这里不关心std :: ostream的线程安全性)

1 个答案:

答案 0 :(得分:1)

根据标准,在函数范围内定义的静态成员的初始化只发生一次。

    static std::ostream os = createStream( *this ); // initialized only once

此外,如果您使用的是C ++ 11,则它是线程安全的。

请看看这些讨论:

1)thread safety of local static initialization in C++11

2)Initialization of static variables

如果您不使用C ++ 11,则operator()不是线程安全的

 static std::ostream os = createStream( *this ); // if not C++11, this is not thread-safe and must be guarded.