C ++ 17 и выше
Используйте inline static
переменные для нединамической инициализации:
struct Foo
{
inline static int I = 0;
};
И в противном случае используйте локальные статические переменные функции:
struct Foo
{
static std::string& Bar()
{
static std::string S = compute();
return S;
}
};
C ++ 14 и ниже
Используйте функцию локальной статики, так как она проще в использовании.
Если по какой-то причине вы действительно хотите статический член данных, вы можете использовать трюк с шаблоном:
template <typename T = void>
struct Foo
{
static int I = 0; // inline initialization only for simple types.
};
template <typename T>
int Foo<T>::I;
О местной статике
Для ресурсов, требующих динамической инициализации, лучше всего использовать локальный статический.
Порядок, в котором статика области видимости файла или класса динамически инициализируется, как правило, не определен, что приводит к Fiasco порядка статической инициализации, когда вы пытаетесь прочитать неинициализированный статический объект как часть инициализации другого. Локальная статика решает проблему за счет ленивой инициализации при первом использовании.
Однако использование локальной статики сопряжено с небольшими накладными расходами. Начиная с C ++ 11, инициализация должна быть потокобезопасной, что обычно означает, что любой доступ ограничивается атомарным чтением и хорошо предсказуемой ветвью.
person
Matthieu M.
schedule
29.07.2012