Здравствуйте, einstein, Вы писали:
E>Я привел пример где удобство записи вполне может обернутся неоправданным уменьшением производительности (особенно в многопоточных приложениях, где обращение к счетчику ссылок возможно нуждается в исп. объектов синхронизации).
Я думаю, причина была не в этом.
С умным указателем вообще медленнее работать, т.к. там всё равно используется разделяемый счётчик. Быстро работать с голым указателем и самому помнить, где его создал и где его надо удалить.
R>>По аналогии с boost::make_tuple или std::make_pair. R>>Может быть есть веские причины, по которым эту функцию не стали делать?
R>Ещё одна проблема есть, которую вроде никто не упоминал. Одна из причин использования динамических объектов — динамический полиморфизм. Поэтому зачастую в сигнатуре функции написано shared_ptr<ISomeInterface>, а ты в функцию передаёшь SomeInterfaceImpl*. Преобразование указателя из SomeInterfaceImpl* в ISomeInterface* иногда надо контролировать. Для чего в shared_ptr есть не только:
R>
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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kan_izh, Вы писали:
_>Добавим 'inline', тогда компилятор в подавляющем большинстве случаев сгенерит точно такой же код для обоих конструкций _>(имхо, не пробовал).
Если там синхронизация, то не соптимизирует.
Тем более, что shared_ptr шаблонный, значит и так доступен для встраивания.
remark wrote: > Имелась в виду ситуация когда надо писать: > > someFunc(IInterfacePtr(p, dynamic_cast_tag())); > C make_shared_ptr будет проблематичнее.
Добавить второй необязательный параметр в make_shared_ptr?..
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kan_izh, Вы писали:
_>remark wrote: >> Имелась в виду ситуация когда надо писать: >> >> someFunc(IInterfacePtr(p, dynamic_cast_tag())); >> C make_shared_ptr будет проблематичнее.
_>Добавить второй необязательный параметр в make_shared_ptr?..