仅用于第一个实例的 C++ 构造函数?

C++ Constructor for first instance only?

所以我有一个带有静态变量的class,它们是静态的原因是(虽然它看起来微不足道)效率(只需要加载一次,减少相同内存中的存储冗余文件)。

无论如何我想知道的是,有没有办法检查变量是否已加载?

或者有没有办法在第一次创建此 class 的实例时调用特定的构造函数,并在存在其他实例时使用另一个构造函数?

如果这些都不合适,解决方案是什么?

给你:

class Test {
  static bool isInitialized;
public:
  Test() {
    if (!isInitialized) {
      // do whatever you need here
      // ...
      isInitialized = true;
    }
  }
};

bool Test::isInitialized = false;

如果您的静态成员是私有的,并且在与所有 class 的成员函数相同的翻译单元中初始化,那么标准保证静态成员在使用之前将被初始化。参见:When are static C++ class members initialized?

在其他情况下此保证对您没有帮助(例如,从另一个翻译单元或从内联成员函数访问非私有静态成员)。

您可以玩带有 isInitialized 标志的游戏,但请注意,如果不做进一步的工作,这不是线程安全的。

C++ 常见问题解答建议将静态 class 实例包装在函数中,这可确保它们在首次使用时被初始化。例如:

Fred& x()
{
    static Fred* ans = new Fred();
    return *ans;
}

来源:https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use

您可以这样做:

struct StaticData
{
  // some variables
};

class YourClass
{
public:
    YourClass(/*..*/) {
        if (staticData == nullptr) {
            staticData = std::make_unique<StaticData>(/*..*/)
        }
    }
private:
    static std::unique_ptr<StaticData> staticData;
};

static std::unique_ptr<StaticData> YourClass::staticData;