Недавно я встретил Nifty Counter Idiom. Я понимаю, что это используется для реализации глобальных переменных в стандартной библиотеке, такой как cout, cerr и т.д. Поскольку эксперты выбрали ее, я предполагаю, что это очень сильный метод.
Я пытаюсь понять, в чем преимущество, используя нечто большее, чем Meyer Singleton.
Например, в файле заголовка можно просто:
inline Stream& getStream() { static Stream s; return s; }
static Stream& stream = getStream();
Преимущество заключается в том, что вам не нужно беспокоиться о подсчете ссылок или размещении нового или иметь два класса, то есть код намного проще. Поскольку это не сделано таким образом, я уверен, что есть причина:
- Не гарантируется ли наличие единого глобального объекта в общих и статических библиотеках? Похоже, ODR должен гарантировать, что может быть только одна статическая переменная.
- Есть ли какая-то стоимость исполнения? Кажется, что и в моем коде, и в Nifty Counter вы следуете одной ссылке, чтобы добраться до объекта.
- Есть ли ситуации, когда подсчет ссылок действительно полезен? Похоже, что это все равно приведет к построению объекта, если заголовок включен и уничтожен на конце программы, например, Meyer Singleton.
- Отвечает ли ответ на что-то вручную? У меня нет слишком большого опыта.
Изменить: мне было предложено написать следующий бит кода во время чтения ответа Якка, я добавлю его к исходному вопросу в виде быстрой демонстрации. Это очень минимальный пример, показывающий, как использование Meyer Singleton + глобальной ссылки приводит к инициализации до main: http://coliru.stacked-crooked.com/a/a7f0c8f33ba42b7f.