Что использовать из boost'а вместо reference counter класса
От: Аноним  
Дата: 14.06.10 11:20
Оценка:
Добрый день.

Была поставлена задача заменить такой класс:


template < class T, class ThreadingModel = ::Loki::ObjectLevelLockable<T> >
class RefCounted : public ThreadingModel {
public:
    RefCounted() : m_refCount(0) {}
protected:
    ~RefCounted() {}  // Note non-virtual
    
public:
    void ref() const;
    void unref() const;
    int getRefCount() const;

private:
    RefCounted(const ClassType&);
    void operator=(const ClassType&);
};



чем-нибудь из boost'а.

Сам класс используется так:


  class MyClass : public RefCounted<MyClass> {
  public:
     MyClass();
     ~MyClass();
  public:
     ...
  };




Насколько я понимаю, для этой цели более всего подходит shared_ptr<MyClass>.
Но, возможно, есть более простой в реализации вариант замены — при использовании shared_ptr нужно будет везде менять отношение наследования на отношение использования.
Re: Что использовать из boost'а вместо reference counter кла
От: _nn_  
Дата: 14.06.10 11:50
Оценка:
Здравствуйте, Аноним, Вы писали:

Тут зависит как используется MyClass.
Если вам нужно общее владение, то boost::shared_ptr подойдет, но нужно иметь ввиду, что требуется выделение памяти.
( Что впрочем не обязательно shared_ptr
Автор: _nn_
Дата: 30.08.06
, лучше ,конечно , не делать так )

Может вам подойдет boost::intrusive_ptr ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Что использовать из boost'а вместо reference counter
От: _ds_  
Дата: 14.06.10 12:19
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Тут зависит как используется MyClass.

__>Если вам нужно общее владение, то boost::shared_ptr подойдет, но нужно иметь ввиду, что требуется выделение памяти.
Нет, общее владение вроде как не нужно.

__>( Что впрочем не обязательно shared_ptr
Автор: _nn_
Дата: 30.08.06
, лучше ,конечно , не делать так )

Это для данного случая слишком сильно .


__>Может вам подойдет boost::intrusive_ptr ?

Тоже вариант.
А насколько корректно использование здесь shared_count из boost/smart_ptr/detail/shared_count.hpp?
Re[3]: Что использовать из boost'а вместо reference counter
От: _nn_  
Дата: 14.06.10 15:26
Оценка:
Здравствуйте, _ds_, Вы писали:

__>>Может вам подойдет boost::intrusive_ptr ?

__>Тоже вариант.
__>А насколько корректно использование здесь shared_count из boost/smart_ptr/detail/shared_count.hpp?

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

Почитайте туториалы и примеры boost smart ptr, может найдется то, что вам нужно.

В любом случае если вам он подходит и сокращает время, то надо юзать
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Что использовать из boost'а вместо reference counter кла
От: Тролль зеленый и толстый  
Дата: 14.06.10 16:56
Оценка:
Что за "отношение использования"? Агрегация, что ли? Чтобы использовать shared_ptr, тебе нужно будет просто убрать везде наследование от старого поинтера, и все.
Re[2]: Что использовать из boost'а вместо reference counter
От: _ds_  
Дата: 16.06.10 09:13
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

ТЗИ>Что за "отношение использования"? Агрегация, что ли? Чтобы использовать shared_ptr, тебе нужно будет просто убрать везде наследование от старого поинтера, и все.


Да, правильно, затупил.

Нужно будет такого:


class MyClass : public RefCounted<MyClass> {
    ...
};
MyClass* SomeFunction();


заменить вот таким:


typedef boost::shared_ptr<MyClass> MyClassPtr;
MyClassPtr SomeFunction();


Но поскольку классы используются в местах, критичных по производительности, вместо shared_ptr буду использовать intrusive_ptr.
Re[4]: Что использовать из boost'а вместо reference counter
От: _ds_  
Дата: 16.06.10 09:19
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, _ds_, Вы писали:


__>>>Может вам подойдет boost::intrusive_ptr ?

__>>Тоже вариант.
__>>А насколько корректно использование здесь shared_count из boost/smart_ptr/detail/shared_count.hpp?

__>Все что есть в бусте можно использовать.

__>Классы которые лежат в директории details не дают гарантию интерфейса, т.е. могут измениться в следующей версии хоть полностью.

__>Почитайте туториалы и примеры boost smart ptr, может найдется то, что вам нужно.


__>В любом случае если вам он подходит и сокращает время, то надо юзать


Ясно, спасибо

Решил таки использовать intrusive_ptr. Для упрощения работы с ним написал такой вот класс:

// initialCounterValue equal to zero if we use intrusive_ptr<MyClass> p(new MyClass); 
// initialCounterValue equal to one if we use intrusive_ptr<MyClass> p(new MyClass, false); 
template<typename T, long initialCounterValue = 0>
class RefCountable {
    friend void intrusive_ptr_add_ref(RefCountable<T> const* p) {
        // increase reference count
        ::InterlockedIncrement(&p->m_refCount);
    }

    friend void intrusive_ptr_release(RefCountable<T> const* p) {
        // decrease reference count and delete object if reference count became equal to zero
        if (0 == ::InterlockedDecrement(&p->m_refCount)) {
            delete p;
        }
    }

protected:
    // constructor
    RefCountable() : m_refCount(initialCounterValue) {}

    // copy constructor
    RefCountable(RefCountable const&) : m_refCount(initialCounterValue) {}

    // assign operator
    RefCountable& operator=(RefCountable const&) {
        return *this;
    }

    // virtual destructor
    virtual ~RefCountable() {}

private:
    long mutable m_refCount;
};


Мне только не нравится, что наследование от него должно быть обязательно public.
Re[5]: Что использовать из boost'а вместо reference counter
От: Guard_h4s Россия  
Дата: 16.06.10 09:38
Оценка:
Здравствуйте, _ds_, Вы писали:

__>Мне только не нравится, что наследование от него должно быть обязательно public.

Но в вашем RefCountable нет открытых данных или методов — соответственно для вас это никакой роли не сыграет.
Даже если кто-то приведет ваш конечный класс к RefCountable ничего осмысленного с ним сделать все равно не сможет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.