2014-01-21 3 views
9

Может ли следующий код облегчить ленивая инициализация?
Или может быть создан singletonInstance, как только кто-то будет включать заголовок (или даже во время запуска программы)?Lazy initialization with singleton pattern

class SingletonClass 
{ 
    private: 
     SingletonClass(); 
     ~SingletonClass(); 

    public: 

     static const SingletonClass& Instance() 
     { 
      static SingletonClass singletonInstance; 
      return singletonInstance; 
     } 
}; 

ответ

11

Это называется Meyers singleton, и они ленивы.

Есть некоторые соображения:

  • одноточечные будут уничтожены в конце программы в обратном порядке, в котором они были созданы, поэтому могут возникнуть проблемы с зависимостями.
  • C++ 03 не гарантирует условия гонки в многопоточных условиях.
+0

Спасибо за ссылку! – cacau

9

SingletonClass конструктор не вызывается раньше, чем somenone вызывает метод Instance().

Таким образом, да, это облегчает ленивую инициализацию.

+0

Интересно! Подумали бы наоборот: т. Е. Статический член-экземпляр * всегда * там ..! – cacau

+4

@cacau: В вашем коде нет статического члена данных. –

+0

@cacau Насколько я помню, в стандарте языка есть гарантия, что компилятор должен реализовать это поведение. Должен ли я искать это для вас? –