Автор Тема: Минимальная поддержка "умных указателей"  (Прочитано 12666 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Минимальная поддержка "умных указателей"
« Ответ #15 : Март 26, 2012, 04:53:45 pm »
Я тут ковыряю Go (может в принципе по работе пригодиться), возможно вот это будет тут в тему: http://golang.org/doc/go_spec.html#Defer_statements
Это синтаксический сахар. Он ничего не добавляет по сути.
Это действительно не то что тебе нужно, но это и не синтаксический сахар.

У меня задача вот какая. Те UnmanagedString о которых я говорил создаются в одном потоке как поля объекта-сообщения, далее этот объект-сообщение обрабатывается в другом потоке и удаляется (фактически помещается в пул для повторного использования). Во время уничтожения все его поля чистятся, соответственно у UnmanagedString вызываются деструктор и она отправляется в свой пул для повторного использования. Так вот мне хочется от языка и от компилятора гарантии, чтобы нигде эта строка никуда не была скопирована простым оператором ":=". Время её жизни равно времени жизни объекта-сообщения и если кто-то её скопирует себе простым оператором ":=", то потом получит сюрприз. Вот поэтому я и думаю о запрете оператора ":=" для некопируемых структур.
А! Хочется "гермитичности типов"? :-) То есть гарантировать чтобы ни один гад не сохранил "указатель" на сущность которая потом будет "удалена". В общем то умный указатель (типа shared_ptr) тут тебе не поможет, в том плане, что он предотвратит не утекание указателей в левые места, а удаление сущности в случае если они таки утекли. Гарантию в рантайме тут даст только какой-нибудь weak_ptr. Но гарантия в рантайме - это слишком слабая гарантия (IMHO).

Таким образом, умные указатели (как и сборщики мусора) тут совершенно не в тему.

По сути тебе тут для твоих "ссылок" (UnmanagedString) нужно изобрести механизм аналогичный обероновско-виртовской передачи по ссылке записей на стеке (VAR-параметры) и невозможности взять их адрес (получить указатель/ссылку на них в явном виде, которую можно скопировать и так далее).

PS. А в шарпе не бывает opaque типов?
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Минимальная поддержка "умных указателей"
« Ответ #16 : Март 26, 2012, 09:40:44 pm »
Я так понимаю, что спрятать структуру за указатель нельзя, потому что мы боремся с GC?
Ага. Я написал struct UnmanagedString { private uint handle; } именно для того чтобы не использовать стандартную указательную System.String.

А! Хочется "гермитичности типов"? :-) То есть гарантировать чтобы ни один гад не сохранил "указатель" на сущность которая потом будет "удалена".
Ага.
В общем то умный указатель (типа shared_ptr) тут тебе не поможет, в том плане, что он предотвратит не утекание указателей в левые места, а удаление сущности в случае если они таки утекли.
Меня такой вариант устроит на 100% если "утекание" будет явным (легко найти поиском).
По сути тебе тут для твоих "ссылок" (UnmanagedString) нужно изобрести механизм аналогичный обероновско-виртовской передачи по ссылке записей на стеке (VAR-параметры) и невозможности взять их адрес (получить указатель/ссылку на них в явном виде, которую можно скопировать и так далее).
Да-да-да. Именно об этом я тут и говорю. О невозможности передать UnmanagedString в процедуру не иначе как по ссылке (в Обероне VAR, в C# ref), и о запрете использования для переменных оператора присваивания "=".
PS. А в шарпе не бывает opaque типов?
System.Object, abstract class, interface сойдут?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Минимальная поддержка "умных указателей"
« Ответ #17 : Март 26, 2012, 09:49:28 pm »
По сути тебе тут для твоих "ссылок" (UnmanagedString) нужно изобрести механизм аналогичный обероновско-виртовской передачи по ссылке записей на стеке (VAR-параметры) и невозможности взять их адрес (получить указатель/ссылку на них в явном виде, которую можно скопировать и так далее).
Да-да-да. Именно об этом я тут и говорю. О невозможности передать UnmanagedString в процедуру не иначе как по ссылке (в Обероне VAR, в C# ref), и о запрете использования для переменных оператора присваивания "=".
Ну, если б у меня такая задача возникла бы в джаве, я бы посмотрел в сторону аннотаций (создание своего типа аннотаций) и своей тулзы для их анализа на этапе компиляции (это в джаве делается просто). Насколько я помню, в шарпах всяких есть какой-то аналог этих самых аннотаций. Соответственно тулзень выдавала бы на этапе компиляции ошибку если б какой-то гад попробовал бы утащить куда-то не туда мою преелесть структуру-псевдоссылку.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Минимальная поддержка "умных указателей"
« Ответ #18 : Март 27, 2012, 09:44:35 am »
А в Яве уже есть структуры (value-type)?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Минимальная поддержка "умных указателей"
« Ответ #19 : Март 27, 2012, 09:50:13 am »
А в Яве уже есть структуры (value-type)?
Нет. Но рантайм и без них неплохо справляется. На стеке когда нужно размещает. В непрерывный кусок памяти сгребает пачку "структур" (в случае того же массива) и так далее.

Я говорил про то, что если б я не хотел чтобы некая ссылка не уплыла куда не надо, или чтобы запретить в некоторых случаях вызовы некоторых методов у некоторых объектов на этапе компиляции, и мне не хватало бы для этого механизмов инкапсуляции жабы (всякие там public/protected/private/default), я бы использовал аннотации.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Минимальная поддержка "умных указателей"
« Ответ #20 : Апрель 03, 2012, 02:21:53 pm »
Пока этот форум был в оффлайне пообсуждали данный вопрос на RSDN:

Приватный operator=
http://rsdn.ru/forum/dotnet/4685453.1.aspx

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Минимальная поддержка "умных указателей"
« Ответ #21 : Апрель 03, 2012, 02:28:47 pm »
Пока этот форум был в оффлайне пообсуждали данный вопрос на RSDN:

Приватный operator=
http://rsdn.ru/forum/dotnet/4685453.1.aspx

А ты не смотрел в сторону WeakReferences? (http://msdn.microsoft.com/en-us/library/ms404247.aspx)

По идее при сборке мусора мусорщик не должен на них оглядываться, то есть алгоритм выяснения кто жив а кто нет должен работать независимо от числа слабых ссылок.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Минимальная поддержка "умных указателей"
« Ответ #22 : Апрель 03, 2012, 03:01:02 pm »
Ничего полезного в слабых указателях для меня нет.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Минимальная поддержка "умных указателей"
« Ответ #23 : Апрель 03, 2012, 03:03:06 pm »
Ничего полезного в слабых указателях для меня нет.
То есть GC при проверке на живущесть объекта все же пробегается и по всем слабым ссылкам? Если да, это это явный косяк реализации.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Минимальная поддержка "умных указателей"
« Ответ #24 : Апрель 03, 2012, 05:07:26 pm »
То есть GC при проверке на живущесть объекта все же пробегается и по всем слабым ссылкам?
Зачем бы ему это делать?

Я говорю что мне они даром не нужны. Применить их не к чему.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Минимальная поддержка "умных указателей"
« Ответ #25 : Апрель 03, 2012, 05:55:21 pm »
По-моему, наличие слабой ссылки не отменяет указатель. Вроде бы, если указателю на объект присвоить новое значение, то старый объект считается мусором: слабые ссылки-то не обходятся... А значит, в один прекрасный момент мусор будет собран, и слабые указатели как минимум перестанут указывать на объект.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Минимальная поддержка "умных указателей"
« Ответ #26 : Апрель 03, 2012, 06:17:52 pm »
По-моему, наличие слабой ссылки не отменяет указатель. Вроде бы, если указателю на объект присвоить новое значение, то старый объект считается мусором: слабые ссылки-то не обходятся... А значит, в один прекрасный момент мусор будет собран, и слабые указатели как минимум перестанут указывать на объект.
Именно в этом и их смысл - если сильных ссылок не осталось, объект стал мусорным и слабые ссылки становятся не валидными. (в некоторых релизациях они обнуляются)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"