подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 10:38
Оценка:
приветствую!

ковыряюсь в коде доставшемся по наследству, и встретил такое:
template<typename T>
struct Singleton {
   private:
      static void instantiate(const T&) {}
      static T& create() {
         static T t;
         instantiate(instance);
         return t;
      }

      StaticObject(const Singleton& /*other*/ ) {}
   public:
      static T& getInstance() {
         return create();
      }
   private:
      static T & instance;
};
template<typename T>
T & Singleton<T>::instance = Singleton<T>::create();

в чем смысл ссылки instance, и функции instantiate()?

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 10:46
Оценка:
единственное чем я могу это объяснить, так это тем, что t в этом синглтоне будет создан в момент создания синглтона, а не в момент первого обращения к getInstance(). это так?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: подскажите, что за странный синглтон?
От: andyp  
Дата: 06.03.15 10:53
Оценка: -1
Здравствуйте, niXman, Вы писали:

X>единственное чем я могу это объяснить, так это тем, что t в этом синглтоне будет создан в момент создания синглтона, а не в момент первого обращения к getInstance(). это так?


Из всех
template<typename T> T & Singleton<T>::instance = Singleton<T>::create();


в разных единицах трансляции останется только один. create() вызовется раз для каждого инстанциируемого типа до входа в main.

А так, неправильные пчелы дали неправильный мед. Кажется, человек, не очень разбирающийся в синглтонах, написал.
Re: подскажите, что за странный синглтон?
От: Abyx Россия  
Дата: 06.03.15 11:12
Оценка:
Здравствуйте, niXman, Вы писали:

X>ковыряюсь в коде доставшемся по наследству, и встретил такое:

X>
X>template<typename T>
X>struct Singleton {
X>   private:
X>      static void instantiate(const T&) {}
X>      static T& create() {
X>         static T t;
X>         instantiate(instance);
X>         return t;
X>      }

X>      StaticObject(const Singleton& /*other*/ ) {}
X>   public:
X>      static T& getInstance() {
X>         return create();
X>      }
X>   private:
X>      static T & instance;
X>};
X>template<typename T>
X>T & Singleton<T>::instance = Singleton<T>::create();
X>

X>в чем смысл ссылки instance, и функции instantiate()?

X>спасибо.


instance нужно чтобы была гарантия что объект создастся до вызова main()
instantiate надо чтобы объект не выпилился оптимизатором
In Zen We Trust
Re: подскажите, что за странный синглтон?
От: Abyx Россия  
Дата: 06.03.15 11:15
Оценка:
Здравствуйте, niXman, Вы писали:

посмотри как синглтон сделан в буст.сериализации — http://www.boost.org/doc/libs/1_57_0/boost/serialization/singleton.hpp
там тоже есть метод use() и T& instance
In Zen We Trust
Re[2]: подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 11:23
Оценка:
Здравствуйте, Abyx, Вы писали:

A>instance нужно чтобы была гарантия что объект создастся до вызова main()

а в чем может быть такая надобность?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 11:25
Оценка: +1
Здравствуйте, Abyx, Вы писали:

A>instantiate надо чтобы объект не выпилился оптимизатором

так instantiate() же пустая, и не volatile. думается мне, современные компиляторы "раскусят" эту ловушку
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: подскажите, что за странный синглтон?
От: andyp  
Дата: 06.03.15 11:40
Оценка:
Здравствуйте, Abyx, Вы писали:

A>посмотри как синглтон сделан в буст.сериализации — http://www.boost.org/doc/libs/1_57_0/boost/serialization/singleton.hpp

A>там тоже есть метод use() и T& instance

Ты прав, оказывается, это борьба с глюком vc6.
Re[3]: подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 11:43
Оценка:
еще один смысл в таком синглтоне может быть в том, что, при использовании С++03 этот синглтон будет потокобезопасным и в функции getInstance() не нужен мьютекс.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: подскажите, что за странный синглтон?
От: andyp  
Дата: 06.03.15 12:03
Оценка:
Здравствуйте, niXman, Вы писали:

X>еще один смысл в таком синглтоне может быть в том, что, при использовании С++03 этот синглтон будет потокобезопасным и в функции getInstance() не нужен мьютекс.


Если ты в том смысле, что все инстансы будут созданы до main, то да.
Re[5]: подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.03.15 12:05
Оценка:
Здравствуйте, andyp, Вы писали:

A>Если ты в том смысле, что все инстансы будут созданы до main, то да.

да, об этом.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: подскажите, что за странный синглтон?
От: Abyx Россия  
Дата: 06.03.15 12:38
Оценка:
Здравствуйте, niXman, Вы писали:

A>>instance нужно чтобы была гарантия что объект создастся до вызова main()

X>а в чем может быть такая надобность?

потокобезопастность, нет ленивого создания — значит не надо мьютекс
In Zen We Trust
Re: подскажите, что за странный синглтон?
От: Mr.Delphist  
Дата: 10.03.15 11:49
Оценка:
Здравствуйте, niXman, Вы писали:

Вопрос в комментарии:

X>ковыряюсь в коде доставшемся по наследству, и встретил такое:

X>
X>template<typename T>
X>struct Singleton {
X>   private:
X>      static void instantiate(const T&) {}
X>      static T& create() {
X>         static T t;
X>         instantiate(instance);
X>         return t;
X>      }

X>      StaticObject(const Singleton& /*other*/ ) {} // тут StaticObject или Singleton?
X>   public:
X>      static T& getInstance() {
X>         return create();
X>      }
X>   private:
X>      static T & instance;
X>};
X>template<typename T>
X>T & Singleton<T>::instance = Singleton<T>::create();
X>


Мне кажется, или тут была защита от копирования (путём утаскивания в private-секцию), которую затем потеряли при копи-пасте? Или что тогда такое этот StaticObject?
Re[2]: подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.03.15 11:52
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Мне кажется, или тут была защита от копирования (путём утаскивания в private-секцию), которую затем потеряли при копи-пасте? Или что тогда такое этот StaticObject?

последствия рефака. я код сюда скопировал во время рефака, до сборки %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: подскажите, что за странный синглтон?
От: andyp  
Дата: 10.03.15 12:43
Оценка:
Здравствуйте, niXman, Вы писали:

X>последствия рефака. я код сюда скопировал во время рефака, до сборки %)


Оператор operator= кинуть в private секцию не забудь. Определять его, так же как и конструктор копирования, не надо (у конструктора копирования фигурные скобочки лишние).
Re[4]: подскажите, что за странный синглтон?
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.03.15 12:51
Оценка:
Здравствуйте, andyp, Вы писали:

A>Оператор operator= кинуть в private секцию не забудь.

ну да, не помешает...

A>Определять его, так же как и конструктор копирования, не надо (у конструктора копирования фигурные скобочки лишние).

кстати да. но оно там уже было.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: подскажите, что за странный синглтон?
От: tdiff  
Дата: 11.03.15 14:09
Оценка:
Здравствуйте, Abyx, Вы писали:

A>instance нужно чтобы была гарантия что объект создастся до вызова main()


3.6.2.4 It is implementation-defined whether the dynamic initialization of a non-local variable with static storage duration is done before the first statement of main. If the initialization is deferred to some point in time after the first statement of main, it shall occur before the first odr-use (3.2) of any function or variable defined in the same translation unit as the variable to be initialized.

Получается, что нет гарантии?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.