用变量值初始化静态有什么运行时成本?

Wil*_*mKF 2 c++ static runtime initialization

在 C++ 中,使用变量值而不是常量值初始化静态变量的合理编译器的预期运行时成本是多少?

例如考虑这个代码:

bool foo();
bool baz1() {
  const bool value = foo();
  static bool alternate1 = value;
  static bool alternate2 = false;

  // Do something.
  return alternate1;
}
Run Code Online (Sandbox Code Playgroud)

alternate1和之间的预期运行时间成本差异是alternate2多少?

Mik*_*our 5

从编译时常量(备选 2)初始化很可能发生在程序启动期间,每次调用函数时都没有成本。

局部静态变量的线程安全初始化将导致编译器生成如下伪代码:

static bool alternate1;

static bool __initialised = false;
static __lock_type __lock;
if (!__initialised) {
    acquire(__lock);
    if (!__initialised) {
        alternate1 = value;
        __initialised = true;
    }
    release(__lock);
}
Run Code Online (Sandbox Code Playgroud)

因此,每次调用函数时都可能对标志进行测试(可能涉及内存屏障或其他同步原语),以及第一次获取和释放锁的进一步成本。

请注意,在您的代码中,foo()无论变量是否已初始化,每次都会被调用。如果您将初始化更改为

static bool alternate1 = foo();
Run Code Online (Sandbox Code Playgroud)

细节当然取决于实现;这是基于我对 GCC 生成的代码的观察。