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

时间:2015-09-26 13:28:56

标签: c++ performance processing-efficiency

所以我有一个带有静态变量的类,它们是静态的原因是(虽然它看起来似乎无关紧要)效率(只需要加载一次,减少同一文件内存中的存储冗余)。

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

C ++ FAQ建议在函数中包装静态类实例,这可以确保在首次使用时初始化它们。 e.g:

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

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

答案 1 :(得分:0)

你走了:

Realm.getInstance(Context context)

答案 2 :(得分:0)

您可以执行以下操作:

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;