Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Различия QSharedDataPointer и tr1::shared_ptr |
Автор: auric 10.8.2008, 01:16 |
Не совсем понимаю,чем отличаются реализации этих классов. В версии Qt класс, который будет использоваться с их интеллектуальным указателем, должен наследоваться от QSharedData (я так понял,что там подсчитываются ссылки). Тогда, возможно, эффективнее использовать shared_ptr из Boost. Кто-нить сталкивался, может объяснить их отличия, преимущества? |
Автор: copermine 10.8.2008, 03:20 |
Это одно и тоже вот если ты юзаеш Qt зачем тебе буст? |
Автор: auric 10.8.2008, 20:16 |
я считаю,что нужно искать всегда более подходящие средства. И вообще интересно знать преимущества первой и второй реализаций. |
Автор: Любитель 11.8.2008, 13:10 |
Это разные вещи. shared_ptr - ready to use, но это обёртка над имеющимся классом. А с QSharedData и пр. реализуется класс, инкапуслирующий подсчёт ссылок и вдобавок COW. |
Автор: copermine 12.8.2008, 04:25 | ||
млин ну абсолютно тоже самое, что я сделаю в стиле:
над имеющимся классом! главное что можно варьировать и избежать использование буста... еще можно раскопать QAtomicPointer и посмотреть сколько там разных политик... +1 пишешь на Qt имеется в арсенале пользуй. |
Автор: Любитель 12.8.2008, 13:17 |
copermine, покажи мне готовый COW с бустом. |
Автор: copermine 12.8.2008, 16:02 |
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-on-write QSharedData не реализует cow, его реализует QSharedDataPointer, в противовес ему есть QExplicitlySharedDataPointer я не понял ты за или против Qt ;) |
Автор: Любитель 12.8.2008, 16:56 |
Я особо не за и не против. Я просто говорю, что это разные вещи ![]() |
Автор: SABROG 12.8.2008, 17:43 |
Я правильно понимаю QSharedDataPointer реализует подсчет ссылок, плюс Copy-on-Write (implicit sharing), в то время как QExplicitlySharedDataPointer использует один и тот же объект даже, если идет его изминение. По сути мало чем отличается от обычного указателя в С++ кроме того, что знает реального владельца объекта. Применение QSharedDataPointer может быть полезным, когда создается большое количество экземпляров одного класса, где каждый объект может быть потенциально изминен, но не обязательно. Применение QExplicitlySharedDataPointer полезно, когда надо сделать большое количество копий указателя. При этом каждая копия увеличивает счетчик и объект разрушается только в том случае, если это последний указатель. Например в поле UserData каждой ячейки таблицы можно поставить такой указатель, при выборе любой ячейки мы можем получать какую-то информацию. При удалении ячеек будут уничтожаться указатели на объект, но при этом сам объект не будет уничтожен пока не удалится последняя ячейка. Это как auto_ptr или есть различия ? |
Автор: copermine 13.8.2008, 06:23 |
типа того, единственный не гуд автоптр и д.р. из стд либ это разная реализация этих либ разработчиками компиляторов, что не есть гуд. к примеру список автоптров может собраться на одном компиляторе и запороть на другом, помню лохонулся с вложенными мапами когда на ггц все собралось, а на мсвс послало очень далеко. |
Автор: SABROG 13.8.2008, 08:22 | ||
Да, есть такое дело при использовании стандартных контейнеров вместе с auto_ptr. Один компилер может собрать такую программу, но ее работа будет не предсказуема, а другой выдаст ворнинг. |