LINUX.ORG.RU

Ответ на: комментарий от imatveev13

При любом способе организации синглтона вызов instance() - оверхед.

Оверхед оверхеду рознь. Нет большой разницы между memory load со стека и из arbitrary memory location. Цена guards с этим просто несопоставима.

ПыСы. Я не утверждаю что function-local statics вселенское зло и не имеют права на жизнь (более того - иногда они просто незаменимы). Я утверждаю что они далеко не бесплатны, и надо себе хорошо отдавать отчёт сколько они стоят.

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

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

Это не чревато, это единственный способ это сделать 100% корректно.

Где-то по пути выполнения программы нужно дёрнуть синглтон без использования, вручную, где-то в начале main() или в инициализации глобальных статических переменных.

Естественно не должно быть каких-либо конструкторов, которые делают что-либо кроме инициализации, но это общее правило безопасного кода. А то встанешь на кривую дорожку и не заметишь как начнёшь в конструкторах пускать потоки, вызывать методы и подобную дичь… тут и до гонок с синглтонами недалеко. 😎

raspopov
()
Ответ на: комментарий от raspopov

Где-то по пути выполнения программы нужно дёрнуть синглтон без использования, вручную, где-то в начале main() или в инициализации глобальных статических переменных.

мы вроде обсуждаем эффективность синглетонов, оформленных как статики в функции получения ссылки на него.

когда б ты ни взял ссылку, весь код с гардами внутри останется с точки зрения эффективности толку ноль. она не повысится.

под «ручной инициализацией» имелась ввиду реализация без статиков, а каким-то специальным кодом, знающем о «правильном порядке» такой инициализации.

alysnix ★★★
()
Ответ на: комментарий от alysnix

когда б ты ни взял ссылку, весь код с гардами внутри останется с точки зрения эффективности толку ноль. она не повысится.

Зачем гарды внутри, если гарантировать первый вызов, как я описал, то статик внутри будет проинициализирован корректно, а большего и не требуется.

под «ручной инициализацией» имелась ввиду реализация без статиков

А как сделать реализацию синглтона «без статиков»?

raspopov
()
Ответ на: комментарий от raspopov

Зачем гарды внутри, если гарантировать первый вызов, как я описал, то статик внутри будет проинициализирован корректно, а большего и не требуется.

я посмотрел как там сделано у гсс и цланга. в принципе - достаточно эффективно.

псевдокоод

проверяем флаг инициализированности обьекта.
если 1, отдаем ссылку - выходим.
захватываем некий общий мьютекс.
проверяем флаг снова, если 1 выходим (тут проверяется потому, что первая проверка флага делается не под мьютексом, для пущей эффективности)
инициализируем обьект
ставим флаг в 1
отдаем мьютекс
отдаем ссылку выходим

то есть если переменная уже инициализирована, захват мьютекса не нужен.

а проблема, что проверка флага делается не под мьютексом и два треда могут вместе попытаться инициализировать обьект решается повторной проверкой флага после захвата мьютекса.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)