gpt4 book ai didi

c++ - 静态本地数据的延迟初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:10 24 4
gpt4 key购买 nike

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

标题:

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

关于c++ - 静态本地数据的延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15916061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com