Hardrefcountshared-ptr
Что такое intrusive reference counting?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Intrusive refcount — счётчик ссылок хранится внутри самого объекта, а не в отдельном control block. Объект наследует от базового класса с atomic<int> ref_count.
class SharedObject {
std::atomic<int> ref_count_{0};
public:
void inc_ref() { ++ref_count_; }
void dec_ref() { if (--ref_count_ == 0) delete this; }
virtual ~SharedObject() = default;
};
class Widget : public SharedObject { /* ... */ };Преимущества перед shared_ptr:
- Один malloc (object + refcount вместе);
- Можно создать shared ptr из raw pointer на already-existing объект;
- Меньше накладных по памяти.
Недостатки: класс должен проектироваться с поддержкой refcount (нельзя изменить сторонний), слабые ссылки нужно реализовывать отдельно. Примеры: COM IUnknown, boost::intrusive_ptr, Qt QSharedData.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.