tag:blogger.com,1999:blog-1235729526357312437.post2785144538954579197..comments2022-04-01T07:31:33.288+06:00Comments on Блог програголика: std::auto_ptr vs boost::scoped_ptr vs std::unique_ptrAnonymoushttp://www.blogger.com/profile/13775188438963326359noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-1235729526357312437.post-33839031905223607162013-01-28T17:34:41.222+07:002013-01-28T17:34:41.222+07:00O(1), к гадалке не ходиO(1), к гадалке не ходиAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-36554361779072732422012-11-24T22:39:36.598+07:002012-11-24T22:39:36.598+07:00>>2 - Абсолютно не главная вещь, только если...>>2 - Абсолютно не главная вещь, только если вы не embedded программист.<br />Мы с Вами живем в эпоху глобального погружения йафоны\йапады и др. девайсы! ;) Так что надо знать!<br /><br />>>вызов inline функции, плюс опционально разыменование указателя.<br />А при чему тут inline? Вы осознаете термин "алгоритмическая сложность" ? Любой алгоритм имеет сложность и совсем не важно будет ли он вставлен по месту вызова или нет.The NT Visigothhttps://www.blogger.com/profile/04995476425133069661noreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-56052526743392807712012-11-22T13:09:11.149+07:002012-11-22T13:09:11.149+07:001 - А какие тут могут быть алгоритмические сложнос...1 - А какие тут могут быть алгоритмические сложности? вызов inline функции, плюс опционально разыменование указателя. В теории грамотный компилятор все это уберет.<br /><br />2 - Абсолютно не главная вещь, только если вы не embedded программист.<br />Anonymoushttps://www.blogger.com/profile/13775188438963326359noreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-2261580501634849772012-11-21T17:11:48.905+07:002012-11-21T17:11:48.905+07:00Забыты и не указаны главные вещи для программера:
...Забыты и не указаны главные вещи для программера:<br />1) Алгоритмические сложности популярных операций с умными указателями<br />2) Насколько увеличится размер исполняемого файла(в Байтах)<br />The NT Visigothhttps://www.blogger.com/profile/04995476425133069661noreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-42464976308199607982012-08-20T22:23:42.910+07:002012-08-20T22:23:42.910+07:00Да, все верноДа, все верноAnonymoushttps://www.blogger.com/profile/13775188438963326359noreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-45685622364115983682012-08-20T17:39:55.747+07:002012-08-20T17:39:55.747+07:00Мне кажется товарисч Аноним не допонял всей эпично...Мне кажется товарисч Аноним не допонял всей эпичности данной ситуации<br /><br />struct X;<br /><br />func(X *px)<br />{<br /> delete px; // компилятор проглотит, ошибки не будет, и деструктор не будет вызван, даже если он есть он где то есть<br />}Cupperhttps://www.blogger.com/profile/17601017646759285962noreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-73514940188917835582012-03-06T16:29:22.572+07:002012-03-06T16:29:22.572+07:00Да, вы правы, я ошибся с примером. :)
Но всё-таки ...Да, вы правы, я ошибся с примером. :)<br />Но всё-таки главное отличие uniq_ptr от auto_ptr, то, что он не копируемый, а _перемещаемый_. Т.е. вы не можете сделать вот так:<br /><br />std::uniq_ptr p(new int);<br />std::uniq_ptr p2 = p; <br /><br />а можете только:<br /><br />std::unique_ptr p(new int);<br />std::unique_ptr p2 = std::move(p);<br /><br />Это значит, что умный указатель p может передаваться, как rvalue без проблем.<br />И ещё unique_ptr умеет корректно удалять массивы объектов, т.к. использует оператор delete[], а не просто delete.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-63230437280762103902012-03-05T21:47:45.497+07:002012-03-05T21:47:45.497+07:00Да, вы безусловно правы, что у ClassOwner генериру...Да, вы безусловно правы, что у ClassOwner генерируется деструктор по умолчанию. Но речь идет не про ClassOwner, а про SimpleClass, у которого определен пользовательский деструктор (в котором мы выводим сообщение на консоль). Здесь особенность заключается в том, что C++ (да и C) позволяет работать с неполными (incomplete) типами. И в случае C++ при удалении указателя на неполный тип компилятор не вызовет для него деструктор, так как он, грубо говоря, не знает где его искать: у компилятора есть только имя типа, но нет никакой информации о том как уничтожить объект. Ведь эта информация может даже не быть в полученном бинарнике (пример - сборка статической библиотеки).<br /><br />Что касается примера, то он полностью верен, я его проверил на g++-4.4.5. также выложил полный пример: github.com/prograholic/blog/tree/master/auto_ptr_testsAnonymoushttps://www.blogger.com/profile/13775188438963326359noreply@blogger.comtag:blogger.com,1999:blog-1235729526357312437.post-1807319225984228072012-03-05T19:18:00.068+07:002012-03-05T19:18:00.068+07:00Что-то я сколько ни пробовал заставить "не вы...Что-то я сколько ни пробовал заставить "не вызваться" деструктор auto_ptr'а из первого примера - ничего не получается. Да собственно, я и понять не могу, как такое может выйти - у класса ClassOwner генерится деструктор по-умолчанию. Иначе и быть не может. Соотв. дёргается деструктор auto_ptr и т.д.<br /><br />Проблема auto_ptr в другом - у него копирующий конструктор совсем не копирующий: сигнатура auto_ptr(auto_ptr& x). Это значит, что он изменяет экземпляр, из которого копирует. Т.е. это и не копирование совсем. А вот uniq_ptr решает эту проблему и кучку других.Anonymousnoreply@blogger.com