Как реализация синглтона Мейерсом на самом деле является синглтономC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как реализация синглтона Мейерсом на самом деле является синглтоном

Сообщение Anonymous »

Я много читал о синглтонах, когда их следует и не следует использовать, а также о том, как их безопасно реализовать. Я пишу на C++11 и столкнулся с ленивой инициализированной реализацией синглтона Мейера, как показано в этом вопросе.

Эта реализация:

Код: Выделить всё

static Singleton& instance()
{
static Singleton s;
return s;
}
Я понимаю, насколько это потокобезопасно, из других вопросов здесь, по SO, но чего я не понимаю, так это того, как это на самом деле одноэлементный шаблон. Я реализовал синглтоны на других языках, и они всегда заканчивались чем-то вроде этого примера из Википедии:

Код: Выделить всё

public class SingletonDemo {
private static volatile SingletonDemo instance = null;

private SingletonDemo() {       }

public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo .class){
if (instance == null) {
instance = new SingletonDemo ();
}
}
}
return instance;
}
}
Когда я смотрю на второй пример, мне очень понятно, почему это синглтон, поскольку класс хранит ссылку на один свой экземпляр и возвращает только этот экземпляр. Однако в первом примере я не понимаю, как это предотвращает существование двух экземпляров объекта. Итак, мои вопросы:
  • Как первая реализация обеспечивает соблюдение одноэлементного шаблона? Я предполагаю, что это связано с ключевым словом static, но я надеюсь, что кто-нибудь сможет подробно объяснить мне, что происходит под капотом.
  • Что из этих двух стилей реализации предпочтительнее другого? Каковы плюсы и минусы?
Спасибо за любую помощь,

Подробнее здесь: https://stackoverflow.com/questions/177 ... -singleton
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»