
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (56) « Первая ... 31 32 [33] 34 35 ... 55 56 ( Перейти к последнему сообщению ) |
Сообщ.
#481
,
|
|
|
Цитата MyNameIsIgor @ Возможно, но аргументация через то, что объект окажется в памяти с защитой от записи и всё упадёт - так себе. Ведь компилятор вполне может (и должен) реагировать на ситуации когда мы явно указываем (mutable), что нечто будет меняться. Но это не означает, что мне нужна эта гарантия через побитовую неизменяемость. |
Сообщ.
#482
,
|
|
|
Цитата DarkEld3r @ Цитата MyNameIsIgor @ Возможно, но аргументация через то, что объект окажется в памяти с защитой от записи и всё упадёт - так себе. Ведь компилятор вполне может (и должен) реагировать на ситуации когда мы явно указываем (mutable), что нечто будет меняться. Но это не означает, что мне нужна эта гарантия через побитовую неизменяемость. ![]() Дилемма ясна - либо такой вот кастрат, либо развитие системы типов для возможности через неё точнее выражать семантику кода. |
Сообщ.
#483
,
|
|
|
Цитата DarkEld3r @ Конечно можно, как в плюсах - cast'ом, но если поставить @safe, то нельзя, но если сильно захотеть и поставить @trusted, то можно. D - такой D. Кстати, D вообще никак не позволяет нарушить иммутабельность? Даже через всякие хаки? ![]() Имутабельность в D скорее защита от случайной ошибки и самодокументироемости, чем реальная защита от Васи. Также как и pure. |
![]() |
Сообщ.
#484
,
|
|
Цитата applegame @ "Честно" иммутабельный - это который действительно не меняет свое внутреннее состояние, а не делает вид, что не меняет, а на самом деле меняет. Счётчик ссылок не внутренне состояние объекта, и shared_ptr --- не сам (иммутабельный) объект. Счётчик придётся изменять потокобезопасным способом, но операции над самим объектом не требуют синхронизации, в чём проблема? |
Сообщ.
#485
,
|
|
|
Цитата korvin @ Это уже обсуждалось выше, не хочу повторять. И да, проблем нет. Счётчик ссылок не внутренне состояние объекта, и shared_ptr --- не сам (иммутабельный) объект. Счётчик придётся изменять потокобезопасным способом, но операции над самим объектом не требуют синхронизации, в чём проблема? |
Сообщ.
#486
,
|
|
|
applegame, я вот тебе не до конца понимаю. Мешает отсутствие GC иммутабельности и работе с иммутабельными данными из разных потоков или нет?
|
Сообщ.
#487
,
|
|
|
Цитата D_KEY @ Да, мешает в некоторой степени.applegame, я вот тебе не до конца понимаю. Мешает отсутствие GC иммутабельности и работе с иммутабельными данными из разных потоков или нет? Проблема во времени жизни иммутабельных данных. В случае наличия GC собственником является GC, который и уничтожает эти данные, когда доступ к ним из кода теряется. В случае отсутствия GC приходится применять замены вроде shared_ptr, который сводит преимущества иммутабельности, а именно отсутствие необходимости в синхронизации, на нет. Кроме того shared_ptr сам по себе - еще то говнецо, хуже него только голый указатель. shared_ptr нужно избегать всеми силами и заменять везде, где только возможо на unique_ptr. Что в вышеупомянутом случае невозможно. Чем он так говнист? Это то, что я вспомнил из личного опыта использования boost::asio + shared_ptr. 1. shared_ptr не умеет обрабатывать циклические ссылки, а значит их обработка ложится на плечи программиста - weak_ptr. То есть даже применив shared_ptr все равно нужно контролировать время жизни объекта. 2. Так как shared_ptr не является частью языка, то при использовании сторонних библиотек не умеющих с ним работать, приходится вытаскивать из shared_ptr непосредственно сам объект, что небезопасно. 3. Сам shared_ptr нифига не потокобезопасен. Опасно обращаться из разных потоков к одному и тому же объекту shared_ptr без синхронизации. 4. Использование указателя на объект завернутого в shared_ptr становится небезопасным везде, в том числе внутри функций-мемберов этого объекта: Никому и нокогда нельзя отдавать голый this, даже если вам кажется, что объект должен жить к моменту использования этого указателя. Лучше перекреститесь и Плохо: ![]() ![]() struct Foo { int a; void foo() { bar([&]{ // опасносте!!! к моменту вызова лямбды объект может быть уже похерен cout << a; }); } }; ![]() ![]() struct Foo : enable_shared_from_this<Foo> { int a; void foo() { auto self = shared_from_this(); bar([=]{ cout << self->a; }); } }; |
Сообщ.
#488
,
|
|
|
Цитата applegame @ В случае отсутствия GC приходится применять замены вроде shared_ptr, который сводит преимущества иммутабельности, а именно отсутствие необходимости в синхронизации, на нет. Вот именно это я и не понимаю... Каким образом? Цитата shared_ptr нужно избегать всеми силами и заменять везде, где только возможо на unique_ptr. Скорее не нужно использовать shared_ptr там, где можно обойтись unique_ptr. Цитата Что в вышеупомянутом случае невозможно. Ну это вопрос спорный. Если организовывать пайпы между тредами, т.е. один объект в один момент времени обрабатывает только какой-то один воркер, то передачи владения вполне достаточно. Кроме того, этот способ, как правило, еще и наиболее эффективен в плане организации многопоточной обработки. Цитата shared_ptr не умеет обрабатывать циклические ссылки, а значит их обработка ложится на плечи программиста - weak_ptr. То есть даже применив shared_ptr все равно нужно контролировать время жизни объекта. Ну так если ты отказался от GC, естественно, нужно ![]() Цитата Так как shared_ptr не является частью языка, то при использовании сторонних библиотек не умеющих с ним работать, приходится вытаскивать из shared_ptr непосредственно сам объект, что небезопасно. Что в этом такого небезопасного? Цитата Сам shared_ptr нифига не потокобезопасен. Опасно обращаться из разных потоков к одному и тому же объекту shared_ptr без синхронизации. Ну для него есть атомики в C++. Хотя по мне так из разных потоков его дергать и не нужно. Цитата Использование указателя на объект завернутого в shared_ptr становится небезопасным везде, в том числе внутри функций-мемберов этого объекта: Никому и нокогда нельзя отдавать голый this, даже если вам кажется, что объект должен жить к моменту использования этого указателя. Лучше перекреститесь и Это все тот же вопрос о владении и контроле времени жизни. Да, об этом нужно думать. Только я так и не понял, при чем тут иммутабельность. Добавлено applegame, а если в C++ использовать boehm, то насколько это сильно страдабельнее, чем в D? |
![]() |
Сообщ.
#489
,
|
|
|
Сообщ.
#490
,
|
|
|
Цитата Qraizer @ Он потокобезопасен полностью Потокобезопасен подсчёт ссылок. Сам объект shared_ptr таких гарантий не даёт, да они и не нужны. |
Сообщ.
#491
,
|
|
|
Цитата D_KEY @ Что именно ты не понимаешь? Указатель на иммутабельный объект можно просто передать, а при использовании shared_ptr будут атомики с барьерами памяти. Я уже писал об этом.Вот именно это я и не понимаю... Каким образом? Цитата D_KEY @ К иммутабельности относился только первый абзац моего ответа. Остальное уже относится скорее к GC vs shared_ptr.Только я так и не понял, при чем тут иммутабельность. Цитата D_KEY @ Если честно, для меня главные преимущества D перед C++: читабельные и мощные шаблоны, UFCS, полноценное CTFE, рефлексия может еще какие-нибудь мелочи забыл. GC просто приятная плюшка без которой можно жить, а местами очень хорошо жить.applegame, а если в C++ использовать boehm, то насколько это сильно страдабельнее, чем в D? Говорят D1 был таким, а потом пришел Александреску и все испортил ![]() Цитата Qraizer @ Ну а что есть в C++ для каруселей? Да и все тобой сказанное известно. Все подводные камни shared_ptr хорошо изучены, описаны и придуманы методы их обхода. Но от этого они не перестают быть подводными камнями. Само наличие подобных комней - это минус. |
Сообщ.
#492
,
|
|
|
Цитата applegame @ Указатель на иммутабельный объект можно просто передать, а при использовании shared_ptr будут атомики с барьерами памяти. Я уже писал об этом. Ну и что? Один раз при передачи в тред ты скопируешь shared_ptr. Я уверен, что для большинства задач это будет абсолютно незаметно. Цитата Цитата D_KEY @ К иммутабельности относился только первый абзац моего ответа.Только я так и не понял, при чем тут иммутабельность. А там были аргументы? ![]() Цитата Остальное уже относится скорее к GC vs shared_ptr. Ну это неинтересно ![]() |
Сообщ.
#493
,
|
|
|
Цитата D_KEY @ Для большинства задач вообще не нужны треды и immutable как таковые. А в реальных сложных многопоточных приложениях, треды имеют свойство постоянно обмениваться друг с другом объектами. А в моем реальном приложении они это делают постоянно. Ну и в конце-концов это просто удобнее. Ну и что? Один раз при передачи в тред ты скопируешь shared_ptr. Я уверен, что для большинства задач это будет абсолютно незаметно. |
Сообщ.
#494
,
|
|
|
Цитата applegame @ А в реальных сложных многопоточных приложениях, треды имеют свойство постоянно обмениваться друг с другом объектами. ![]() В реальных многопоточных приложениях будет так, как ты сделаешь. Для обмена объектами достаточно unique_ptr и передачи владения. Добавлено Цитата applegame @ Ну и в конце-концов это просто удобнее. Возможно. Но это выходит за рамки холивара, т.к. не является объективным критерием. |
Сообщ.
#495
,
|
|
|
Цитата D_KEY @ К сожалению, зачастую недостаточно. Точнее, зачастую невозможно передать владение. Для обмена объектами достаточно unique_ptr и передачи владения. |