c++ - C++中什么时候调用static init

标签 c++

我有一个包含三个源文件的 C++ 程序:

// main.cpp

auto return_value = managed_call(int value);


// managed.cpp

#include "private_impl.hpp"
int managed_call(int arg) {
   if (arg == 0)
      return private_func();
   else
      return arg;
} 



//private_impl.cpp

static some_type some_var = construct_static_object_might_blow();

int private_func() {
   ....
   return 42;
}

我的问题是关于private_impl.cpp中静态对象的初始化:“什么时候发生?”或者更具体地说 - 它是否在调用 private_func 函数时才被初始化?

更新

我实际上把这个例子简化得有点太多了;有问题的代码将作为 Python 扩展运行 - 即它是 dlopen() ,这是关键的初始化步骤。 This SO question事实证明是正确的。

最佳答案

When is the static init called in C++

我想你的意思是,具有静态存储持续时间的变量何时初始化。如果变量具有静态初始化,那么这会在其他任何事情之前发生。

如果变量具有动态初始化,则在静态初始化期间它最初为零初始化。动态初始化的确切点是实现定义的。该变量将在第一次访问该变量或该翻译单元 (TU) 中的任何其他变量之前或调用该 TU 中的任何函数之前的某个时刻进行初始化。

is it only initialized if the private_func function is called?

无论private_func是否被调用,它都可能被初始化。但如果private_func被调用,那么该变量将在函数调用之前的某个时刻被初始化。我不清楚初始化是否可以推迟到永远不会发生。

相关标准引用在此SO post .

关于c++ - C++中什么时候调用static init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59056311/

相关文章:

c++ - 如何使用 PCH 或 PTH 提高 clang 解析性能?

c++ - sizeof(T) 可以产生的最大值是多少?

javascript - x++和++x有什么区别

c++ - 为什么我用 Boost.ASIO 实现的简单 HTTP 服务器需要 sleep 才能正常工作

c++ - 在 Visual Studio 2010 中创建第二个 C++ 项目

C++ 为什么输出/返回函数参数的双指针?

c++ - 将项目导入Android Studio后出错

c++ - QAbstractItemModel 中的嵌套操作

c++ - 在 Windows 中从 C++ 启动一个 .exe 文件

c++ - 如何改变QSharedMemory的大小