производительность — конструктор C ++ только для первого экземпляра?

Итак, у меня есть класс со статическими переменными, причина в том, что они статичны для (хотя это может показаться незначительным) эффективности (требуется только однажды загрузить, уменьшить избыточность памяти в том же файле).

В любом случае, что я хотел бы знать, есть ли способ проверить, была ли загружена переменная?

Или есть способ получить конкретный конструктор, называемый при первом создании экземпляра этого класса, а другой — при наличии других экземпляров?

Если ни один из них не подходит, каково решение?

0

Решение

Если ваши статические члены являются частными и инициализируются в том же модуле перевода, что и все функции-члены вашего класса, тогда стандарт гарантирует, что статические члены будут инициализированы до их использования. Увидеть: Когда инициализируются статические члены класса C ++?

В других ситуациях эта гарантия вам не помогает (например, доступ к не приватным статическим элементам из другого модуля перевода или из встроенных функций-членов).

Вы можете играть в игры с isInitialized флаги, но имейте в виду, что без дальнейшей работы это не потокобезопасно.

В FAQ по C ++ рекомендуется заключать экземпляры статических классов в функции, что гарантирует их инициализацию при первом использовании. например.:

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

Источник: https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use

3

Другие решения

Ну вот:

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

bool Test::isInitialized = false;
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;
0
По вопросам рекламы [email protected]