boost::intrusive_ptr - как с ним работать
От: yxiie Украина www.enkord.com
Дата: 04.05.04 08:33
Оценка:
Здравствуйте!

в описании к сабжу написано что они искользует вызовы к функциям intrusive_ptr_add_ref & intrusive_ptr_release для сче5тчика ссылок. дело в том, что в бусте я этих функций не нашел. Интересно, их что надо самому писать?
Если да, то не могли бы вы привести примеры их удачных реализаций, или ткните меня носом =)

Заранее благодарю
Re: boost::intrusive_ptr - как с ним работать
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 04.05.04 09:21
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>Здравствуйте!


Y>в описании к сабжу написано что они искользует вызовы к функциям intrusive_ptr_add_ref & intrusive_ptr_release для сче5тчика ссылок. дело в том, что в бусте я этих функций не нашел. Интересно, их что надо самому писать?

Да, самому.
Y>Если да, то не могли бы вы привести примеры их удачных реализаций, или ткните меня носом =)

Например для COM:
namespace boost
{
void intrusive_ptr_add_ref(IUnknown *P) { P->AddRef(); }
void intrusive_ptr_release(IUnknown *P) { P->Release(); }
}
getboost.codeplex.com
citylizard.codeplex.com
Re: boost::intrusive_ptr - как с ним работать
От: Bell Россия  
Дата: 04.05.04 09:22
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>Здравствуйте!


Y>в описании к сабжу написано что они искользует вызовы к функциям intrusive_ptr_add_ref & intrusive_ptr_release для сче5тчика ссылок. дело в том, что в бусте я этих функций не нашел. Интересно, их что надо самому писать?


Естественно — откуда бустовцы знают, как у тебя происходит изменение счетчика ссылок?!

Y>Если да, то не могли бы вы привести примеры их удачных реализаций, или ткните меня носом =)


Вот простейший пример:


template<typename T>
void intrusive_ptr_add_ref(T* ptr)
{
   ptr->add_ref();
}

template<typename T>
void intrusive_ptr_release(T* ptr)
{
   if(!ptr->release())
      delete ptr;
}

class test
{
   int ref_cnt_;
   test(const test&);
   test& operator = (const test&);

public:
   test() : ref_cnt_(0) {}
   ~test() { std::cerr << "~test() " << std::endl; }
   int add_ref() { return ++ref_cnt_; }
   int release() { return --ref_cnt_; }
};

int main()
{
   test* p = 0;
   boost::intrusive_ptr<test> ptr;
   
   {
      p = new test();
      boost::intrusive_ptr<test> ptr2(p);
      ptr = ptr2;
   }

   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re: boost::intrusive_ptr - как с ним работать
От: yxiie Украина www.enkord.com
Дата: 04.05.04 09:38
Оценка:
Спасибо за ответы.

Дело в том что вопрос скорости стоит очень жестко. Может кто-то сталкивался с необходимостью *быстрого* подсчеста ссылок. Был бы рад упидеть исходник. Да и еще какая разница между intrusive_ptr и shared_ptr особенно в плане скорости?
Re[2]: boost::intrusive_ptr - как с ним работать
От: WolfHound  
Дата: 04.05.04 11:20
Оценка:
Здравствуйте, Bell, Вы писали:

B>Естественно — откуда бустовцы знают, как у тебя происходит изменение счетчика ссылок?!

+1
Y>>Если да, то не могли бы вы привести примеры их удачных реализаций, или ткните меня носом =)

B>Вот простейший пример:

А вот шаблонами я бы их делать не стал... Боком выходит когда в программе встречается несколько типов подсчета ссылок.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: boost::intrusive_ptr - как с ним работать
От: Bell Россия  
Дата: 04.05.04 11:38
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А вот шаблонами я бы их делать не стал... Боком выходит когда в программе встречается несколько типов подсчета ссылок.


Но ведь никто не запрещает перегрузить эти функции, если такая необходимость возникнет
А вообще это как реализация поведения по умолчанию виртуальных функций базового класса — иногда нужно иметь умолчательное поведение, а иногда просто противопоказано.
Все определяется конкретными условиями, ИМХО.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.