2013-04-10 3 views
2

Я следующий код (часть его была опущена для простоты)Ленивая инициализация статических локальных данных

Заголовок:

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() никогда не называют

Я хотел бы знать, если поведение я жду, что произойдет, и если это могу идею или я делаю что-то очень неправильно, не замечая этого.

Каковы последствия для безопасности потоков и безопасности исключений?

(рассмотрит поток, созданный бы сами поточно-потому что безопасность нити станда :: ostream здесь не моя проблема)

ответ

1

В соответствии со стандартом инициализация статических элементов, определенных в области функций, происходит только один раз.

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

Кроме того, он является потокобезопасным, если вы используете C++ 11.

Pls взглянуть на эти обсуждения:

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

2) Initialization of static variables.

Если вы не используете C++ 11, то оператор() не поточно

static std::ostream os = createStream(*this); // if not C++11, this is not thread-safe and must be guarded. 
Смежные вопросы