[英]Lazy initialization on static local data
我有以下代碼(為簡單起見,省略了一部分)
標題:
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;
我真的不知道以這種方式調用函數時static的行為。
我希望函數createStream
只會被調用一次(或者如果從不調用operator()
則永遠不會被調用
我想知道我期望的行為是否會發生,這是否可行,或者我在做錯了什么而沒有注意到它。
對線程安全和異常安全有什么影響?
(考慮到創建的流本身就是線程安全的,因為在這里我不關心std :: ostream的線程安全性)
按照標准,在函數范圍內定義的靜態成員的初始化僅發生一次。
static std::ostream os = createStream( *this ); // initialized only once
另外,如果您使用的是C ++ 11,它是線程安全的。
請看一下這些討論:
2) 靜態變量的初始化 。
如果您未使用C ++ 11,則operator()不是線程安全的
static std::ostream os = createStream( *this ); // if not C++11, this is not thread-safe and must be guarded.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.