簡體   English   中英

靜態本地數據的延遲初始化

[英]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,它是線程安全的。

請看一下這些討論:

1) 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM