Как стать автором
Обновить

Быстрый однопоточный std::shared_ptr в GCC

Уровень сложностиПростой
Время на прочтение1 мин
Количество просмотров2.5K

Все знают что std::shared_ptr/weak_ptr тормозят, но это не повод от них отказываться и писать свой велосипед или небезопасный код на сырых указателях, ведь ситуацию можно исправить выключив синхронизацию потоков. Код который я вам покажу, работает в GCC и позволяет сконструировать новый shared_ptr без атомарных синхронизаций. Если у вас однопоточное приложение, вы можете подставить этот новый шаред поинтер за место старого для ускорения программы.

#include <memory>

template <class T>
using Shared = std::__shared_ptr<T, __gnu_cxx::_S_single>;

template <class T>
using Weak = std::__weak_ptr<T, __gnu_cxx::_S_single>;

template <class T, typename... Args>
Shared<T> new_shared(Args&&... args) { return Shared<T>(new T(args...)); }

Пример как это использовать:

auto player_sptr = new_shared<Player>();
Weak<Player> player_wptr {player_sptr};

На этом гайд закончился.
* Плюсы - выглядит так же, как и стдшный шаред поинтер. Насколько теперь это тормозит? Настолько, насколько тормозит доступ к двум ячейкам памяти размером с sizeof (тип_поинтера_в_вашей_ОС).
* Минусы - небезопасно в многопотоке; работает только в GCC

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 4: ↑4 и ↓0+5
Комментарии9

Публикации

Истории

Работа

QT разработчик
7 вакансий
Программист C++
88 вакансий

Ближайшие события