【问题标题】:Does the C++ "magic static" pattern work for all initialization styles?C++ \"magic static\" 模式是否适用于所有初始化样式?
【发布时间】:2023-01-12 07:17:11
【问题描述】:

我知道自 C++11 以来,局部变量的 C++“魔术静态”模式 guarantees thread-safe initialization。无论本地如何初始化,这都适用吗?

int some_expensive_func();

void test()
{
  static int attempt1{some_expensive_func()};
  static int attempt2 = {some_expensive_func()};
  static int attempt3 = some_expensive_func();
  static int attempt4(some_expensive_func());
}

我有一个内部静态分析检查器抱怨上面显示的第三种样式的线程安全性,但我认为没关系,我正在寻找确认。谢谢。

【问题讨论】:

  • 提供指向魔术静态的链接。而且我在您的代码中看不到如何调用任何东西。
  • 任何这种表达方式都是“初始化”,只是初始化形式略有不同。而且由于保证初始化是线程安全的,因此它具有哪种形式并不重要。
  • @NeilButterworth 我链接到一篇关于魔术静力学的相关 SO 帖子。该术语未在链接的答案中明确使用,但在帖子的其他地方使用,并且在网络的其他地方也可以看到。不过,我不确定您所说的“如何调用任何东西”是什么意思。
  • 函数局部静态对象初始化需要是线程安全的。不知道“魔术”部分是什么。

标签: c++ c++11 static thread-safety


【解决方案1】:

是的,所有初始化样式对于局部静态变量都是线程安全的 (C++11 起)。唯一不是线程安全的是实际上不是初始化的东西,例如,像这样:

static int x;               // zero-initialized on program startup
x = some_expensive_func();  // this is assignment, not initialization

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 2012-09-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    相关资源
    最近更新 更多