Re[6]: почему нет boost::make_shared_ptr ?
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 09:25
Оценка:
Здравствуйте, einstein, Вы писали:

E>Я привел пример где удобство записи вполне может обернутся неоправданным уменьшением производительности (особенно в многопоточных приложениях, где обращение к счетчику ссылок возможно нуждается в исп. объектов синхронизации).



Я думаю, причина была не в этом.
С умным указателем вообще медленнее работать, т.к. там всё равно используется разделяемый счётчик. Быстро работать с голым указателем и самому помнить, где его создал и где его надо удалить.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: почему нет boost::make_shared_ptr ?
От: night beast СССР  
Дата: 15.03.06 09:34
Оценка:
Здравствуйте, remark, Вы писали:

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


R>>Меня удивляет, что в бусте нет такой функции:

R>>
R>>namespace boost{
R>>template<typename T>
R>>shared_ptr<T> make_shared_ptr(T * t)
R>>{
R>>  return shared_ptr<T>(t);
R>>}
R>>}//namespace boost
R>>


R>>По аналогии с boost::make_tuple или std::make_pair.

R>>Может быть есть веские причины, по которым эту функцию не стали делать?


R>Ещё одна проблема есть, которую вроде никто не упоминал. Одна из причин использования динамических объектов — динамический полиморфизм. Поэтому зачастую в сигнатуре функции написано shared_ptr<ISomeInterface>, а ты в функцию передаёшь SomeInterfaceImpl*. Преобразование указателя из SomeInterfaceImpl* в ISomeInterface* иногда надо контролировать. Для чего в shared_ptr есть не только:


R>
R>    template<class Y>
R>    shared_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
R>


R>Но и:


R>
R>    template<class Y>
R>    shared_ptr(shared_ptr<Y> const & r, detail::static_cast_tag): px(static_cast<element_type *>(r.px)), pn(r.pn)

R>    template<class Y>
R>    shared_ptr(shared_ptr<Y> const & r, detail::const_cast_tag): px(const_cast<element_type *>(r.px)), pn(r.pn)

R>    template<class Y>
R>    shared_ptr(shared_ptr<Y> const & r, detail::dynamic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)

R>    template<class Y>
R>    shared_ptr(shared_ptr<Y> const & r, detail::polymorphic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
R>


R>Так вот к этим функциям ты не получишь доступ, если будешь использовать make_shared_ptr.


а зачем к ним доступ, когда есть

 template<class T, class U>
    shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r); // never throws

  template<class T, class U>
    shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r); // never throws

  template<class T, class U>
    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r); // never throws


R>


Re[3]: почему нет boost::make_shared_ptr ?
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 09:40
Оценка:
Здравствуйте, night beast, Вы писали:

NB>а зачем к ним доступ, когда есть


NB>
NB> template<class T, class U>
NB>    shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r); // never throws

NB>  template<class T, class U>
NB>    shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r); // never throws

NB>  template<class T, class U>
NB>    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r); // never throws
NB>



Ну и как тогда писать?

someFunc(dynamic_pointer_cast<IInterfacePtr>(make_shared_ptr(new InterfaceImpl));


Не особая выгода от make_shared_ptr


R>>

NB>

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: почему нет boost::make_shared_ptr ?
От: night beast СССР  
Дата: 15.03.06 09:49
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, night beast, Вы писали:


NB>>а зачем к ним доступ, когда есть


NB>>
NB>> template<class T, class U>
NB>>    shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r); // never throws

NB>>  template<class T, class U>
NB>>    shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r); // never throws

NB>>  template<class T, class U>
NB>>    shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r); // never throws
NB>>



R>Ну и как тогда писать?


R>
R>someFunc(dynamic_pointer_cast<IInterfacePtr>(make_shared_ptr(new InterfaceImpl));
R>


не, они нужны для upcast'a. (например у тебя есть shared_ptr<void> x(new Test),
а тебе нужен shared_ptr<Test> y = static_pointer_cast<Test>(x)).

поэтому просто

someFunc( shared_ptr<IInterfacePtr> (new InterfaceImpl) );


R>Не особая выгода от make_shared_ptr


если звезды зажигают, значит это кому-нибудь нужно...

R>>>

NB>>
R>
Re[6]: почему нет boost::make_shared_ptr ?
От: kan_izh Великобритания  
Дата: 15.03.06 10:01
Оценка:
einstein wrote:

> Во-первых, как я понимаю, вы хотите использотвать эту ф-цию, чтобы

> лишний раз не писать тип T и чтобы он выводился автоматически (т.к.
> шаблонные ф-ции позволяют это делать)
Да.

> Давайте проанализируем что происходит при вызове

> func(make_shared_ptr(new A)) ?
> Создается новый объект A в куче, передается ф-ции, она инициализирует в
> строке (1) временный объект типа shared_ptr<T> значением этого указателя
> и, таким образом принимает владение этим объектом. Счетчик ссылок при
> этом устанавливается равным 1. Далее при возврате из ф-ции происходит
> копирование этого временного объекта в другой временный объект
> shared_ptr<T> (который уже потом передается func, возможно опять с
> дополнительным копированием). При копировании с помощью конструктора
> копирования shared_ptr счетчик ссылок увеличивается и становится 2,
> далее после выхода из области видимости первого объекта он опять
> становится равным единице.
Добавим 'inline', тогда компилятор в подавляющем большинстве случаев сгенерит точно такой же код для обоих конструкций
(имхо, не пробовал).

> Я привел пример где удобство записи вполне может обернутся неоправданным

> уменьшением производительности (особенно в многопоточных приложениях,
> где обращение к счетчику ссылок возможно нуждается в исп. объектов
> синхронизации).
В общем, потестить надо...
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: почему нет boost::make_shared_ptr ?
От: kan_izh Великобритания  
Дата: 15.03.06 10:13
Оценка:
remark wrote:

>

> Кстати, вроде никто не упоминал это
> <http://boost-consulting.com/vault/index.php?direction=0&amp;order=&amp;directory=Memory&gt;
> (см. shared_new)
> Так, что не всё так плохо
Клёва!
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: почему нет boost::make_shared_ptr ?
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 10:53
Оценка:
Здравствуйте, night beast, Вы писали:

NB>поэтому просто


NB>
NB>someFunc( shared_ptr<IInterfacePtr> (new InterfaceImpl) );
NB>



Ну вот про это-то я и говорю, что в таких случаях преимущества от make_shared_ptr пропадают.




R>>>>

NB>>>
R>>
NB>

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[7]: почему нет boost::make_shared_ptr ?
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 10:54
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>Добавим 'inline', тогда компилятор в подавляющем большинстве случаев сгенерит точно такой же код для обоих конструкций

_>(имхо, не пробовал).


Если там синхронизация, то не соптимизирует.
Тем более, что shared_ptr шаблонный, значит и так доступен для встраивания.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: почему нет boost::make_shared_ptr ?
От: kan_izh Великобритания  
Дата: 15.03.06 11:16
Оценка: +1
remark wrote:

> NB>someFunc( shared_ptr<IInterfacePtr> (new InterfaceImpl) );
> NB>


> Ну вот про это-то я и говорю, что в таких случаях преимущества от

> make_shared_ptr пропадают.
someFunc( make_shared_ptr(new InterfaceImpl) );

И в чём принципиальная разница? И чем хуже?
А то что не нужно тип явно потерять — имхо лучше смотрится.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: почему нет boost::make_shared_ptr ?
От: kan_izh Великобритания  
Дата: 15.03.06 11:17
Оценка:
kan_izh wrote:
> И в чём принципиальная разница? И чем хуже?
> А то что не нужно тип явно писать — имхо лучше смотрится.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: почему нет boost::make_shared_ptr ?
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 11:29
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>remark wrote:


_>
>> NB>someFunc( shared_ptr<IInterfacePtr> (new InterfaceImpl) );
>> NB>
_>


>> Ну вот про это-то я и говорю, что в таких случаях преимущества от

>> make_shared_ptr пропадают.
_>
_>someFunc( make_shared_ptr(new InterfaceImpl) );
_>

_>И в чём принципиальная разница? И чем хуже?
_>А то что не нужно тип явно потерять — имхо лучше смотрится.


Имелась в виду ситуация когда надо писать:

someFunc(IInterfacePtr(p, dynamic_cast_tag()));


C make_shared_ptr будет проблематичнее.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: почему нет boost::make_shared_ptr ?
От: kan_izh Великобритания  
Дата: 15.03.06 11:56
Оценка:
remark wrote:
> Имелась в виду ситуация когда надо писать:
>
> someFunc(IInterfacePtr(p, dynamic_cast_tag()));
> C make_shared_ptr будет проблематичнее.

Добавить второй необязательный параметр в make_shared_ptr?..
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[9]: почему нет boost::make_shared_ptr ?
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 12:14
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>remark wrote:

>> Имелась в виду ситуация когда надо писать:
>>
>> someFunc(IInterfacePtr(p, dynamic_cast_tag()));
>> C make_shared_ptr будет проблематичнее.

_>Добавить второй необязательный параметр в make_shared_ptr?..


Какой???
И что с ним делать?



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.