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 подскажет развёрнутый ответ в реальном времени.