Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> smart pointer 
:(
    Опции темы
 
addRef() vs. shared_ptr<>
addRef [ 0 ]  [0.00%]
shared_ptr [ 9 ]  [75.00%]
зависит от задачи [ 3 ]  [25.00%]
Всего проголосовавших: 12
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
cupper
Дата 1.6.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Хотел бы немного подискутировать на тему умных указателей. А именно. Есть два типа умных указателей, с ручным подсчетом ссылок (addRef/releaseRef), и с автоматическим по типу shared_ptr. Удобство и смысл второго, для меня всецело понятен, и без него жизнь не мила. Суть первого понятна, но, удобством что то тут особо и не попахивает. Вернее я его не вижу.

Но, например если рассматривать конкретную задачу, библиотеку, то возможен такой случай:
есть некий главный класс Engine, есть некие другие классы например Session и Message. Библиотека дает возможность создать экземпляр Engine, но не дает возможности на прямую создавать Session и Message. Их можно создать только через экземпляр Engine, и получить указатель на них. Например для того что бы сугубо контролировать число и работу сессий через Engine.

Тогда получается следующая иерархия
Код

class Ref {public: addRef(); release()};

class Session : public Ref
{
protected:
   Session();
   ~virtual Session();
public:
   vrtual void virtualMethod() = 0;
};

class XSession : public Session
{
public:
    XSession();
    vrtual void virtualMethod() {};
protected:
   ~virtual XSession();
private::
    XSessionImpl* impl;
}

class XSessionImpl
{};


на ружу (доступны из библиотеки) у нас торчит только абстрактный Session. В самой же библиотеки работа ведется с XSession. Таким образом мы не даем пользователю возможности на прямую создавать экземпляры Session и предоставляем ему не голый указатель а smart pointer. Втиснуть в эту логику shared_ptr не получится, хотя бы из за того что у того кто будет пользоваться библиотекой boost'a не будет, ибо на C# нету его %) Ну или я просто недодумал как это сделать.

Теперь ваши примеры, и практика использования smile

Ахда, самое важное, когда я спросил можно ли я отойду от логики ручного подсчета и заюзаю shared_ptr (ну мол все равно ничего не изменить (это до того как я сообразил что все равно не выйдет заюзать)) я услышал в ответ нечто подобное "shared_ptr не нравиться, использую только когда не возможно intrusive использовать". Я помню что порой встречал ярые споры на тему что shared_ptr страшное зло и надо юзать там что то другое. Вот и решил углубиться и узнать мнения дгурих и перенять опыт, дабы слепо не махать тапками во время спора.
PM MAIL   Вверх
xvr
Дата 2.6.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



addRef/releaseRef применяется в реализации различных платформ, для встраивания в них GC. При этом объекты самой платформы обладают встроенным счетчиком ссылок, но предназначен он не для упрощения жизни самих объектов, а того, что платформа реализует.

Основное применение этого подхода - движки различных скриптовых (или byte code ориентированных) языков со встроенной GC. В этом случае объекты с addRef/releaseRef - это native реализация объектов языка, а пользователь этой функциональности - программа на этом самом скриптовом языке.

Второй пример - COM (и все, что от него растет).

Кстати, addRef/releaseRef никоим образом не мешает сделать поверх него аналог shared_ptr, для использования в самих объектах (или для прямой с ними работы). Яркий пример - COM + Atl CComPtr


PM MAIL   Вверх
cupper
Дата 2.6.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(xvr @ 2.6.2011,  12:39)
addRef/releaseRef применяется в реализации различных платформ, для встраивания в них GC. При этом объекты самой платформы обладают встроенным счетчиком ссылок, но предназначен он не для упрощения жизни самих объектов, а того, что платформа реализует.

Основное применение этого подхода - движки различных скриптовых (или byte code ориентированных) языков со встроенной GC. В этом случае объекты с addRef/releaseRef - это native реализация объектов языка, а пользователь этой функциональности - программа на этом самом скриптовом языке.

Второй пример - COM (и все, что от него растет).

Кстати, addRef/releaseRef никоим образом не мешает сделать поверх него аналог shared_ptr, для использования в самих объектах (или для прямой с ними работы). Яркий пример - COM + Atl CComPtr

Я не знаю что такое GC, поэтому не понял о чем вы smile можно ссылку ? 

То что над addRef/release можно сделать умную обертку это само собой понятно, во только это как то нелепо выглядит: "умный указатель для умного указателя".
PM MAIL   Вверх
xvr
Дата 2.6.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(cupper @  2.6.2011,  22:01 Найти цитируемый пост)
Я не знаю что такое GC, поэтому не понял о чем вы

Это Garbage Collection, по русски будет 'Сборка мусора'. 'Умные поинтеры' - это один из способов реализации этой самой GC
Цитата(cupper @  2.6.2011,  22:01 Найти цитируемый пост)
То что над addRef/release можно сделать умную обертку это само собой понятно, 

Ну так собственно и делают. Сами addRef/release лиш дают возможность, но не обеспечивают автоматическую сборку мусора/удаление неиспользуемых объектов. А вот обвернутые вокруг них smart pointer'ы обеспечивают.
Цитата(cupper @  2.6.2011,  22:01 Найти цитируемый пост)
во только это как то нелепо выглядит: "умный указатель для умного указателя". 

Нормально это выглядит, я уже упоминал - CComPtr в Atl. Аналоги есть в MFC, VCL (по видимому и в Qt). А в Object Pascal (a-la Delphi) их встроили на уровне языка. На голых addRef/release работают лишь если эти объекты можно пересчитать по пальцам и место их использования можно охватить одним взглядом на экран. Ну и еще настоящие мазохисты  smile 
Явное использование addRef/release на уровне объектов (без враперов) более провоцирует на ошибки, чем позволяет реализовать полноценный GC

PM MAIL   Вверх
kemiisto
Дата 2.6.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Цитата(xvr @  2.6.2011,  21:14 Найти цитируемый пост)
Это Garbage Collection, по русски будет 'Сборка мусора'. 'Умные поинтеры' - это один из способов реализации этой самой GC

Более удачным (как, например, тут) будет деление механизмов управления памятью на три группы
  • ручное (manual memory management);
  • полуавтоматическое (semi-automatic memory management, иногда semi-manual);
  • автоматическое (automatic memory management).
Умные указатели попадают во вторую группу, сборка мусора - в третью.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
bsa
Дата 3.6.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(xvr @  2.6.2011,  22:14 Найти цитируемый пост)
по видимому и в Qt

Что-то не видел я такого. Там есть QSharedPointer, аналог boost::shared_ptr.
Если где-то и используется addRef/release, то это скрыто глубоко в недрах платформозависимого кода и наружу не выходит.
Цитата(xvr @  2.6.2011,  22:14 Найти цитируемый пост)
Явное использование addRef/release на уровне объектов (без враперов) более провоцирует на ошибки, чем позволяет реализовать полноценный GC
Думаю, что addRef/release пришло из С. Например, в OpenSSL именно так реализуется модель COW при работе с большими числами. Возможности сделать полноценный конструктор/деструктор нет, вот народ и делал, что мог.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0698 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.