Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 162 163 [164] 165 166 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2446
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ В системах со сборкой мусора нет другого способа ссылаться на объект, не являясь одним из его владельцев. Пример я уже приводил - список подписчиков.а в системах с GC так и не пишут, чтобы возникала необходимость в мягких ссылках, а многие даже и подумать не могут, что такое вообще есть и зачем-то даже кому-то нужно. и "владельцев" нет. а список подписчиков делается и без этого. Так ты можешь объяснить как? Или просто оставляем объект висеть в списке ?Цитата дык этого и нет ни в одном ЯП с GC, что я знаю (ну кроме джавы и возможно C#). Когда языки с GC, которые ты знаешь(кроме Java и C#), по широте решаемых с помощью их задач приблизятся к тем же java и C#, тогда и поговорим. Цитата Кто был первым не знаю, но сложно найти литературу или статью по GC, в которой бы эта тема не затрагивалась хотя бы одни абзацем. http://en.wikipedia.org/wiki/Garbage_colle...weak_references Цитата Strong and weak references The garbage collector can reclaim only objects that have no references. An object that is reachable cannot be garbage collected by the garbage collector. Such a reference is known as a strong reference. An object can also be referred to as a weak reference, also known as the target. An object is eligible for garbage collection if it does not contain any strong references, irrespective of the number of weak references it contains. There are two types of weak references; a long weak reference tracks resurrection while a short weak reference does not. The primary advantage of maintaining weak references to an object is that it allows the garbage collector to collect or reclaim memory of the object if it runs out of memory in the managed heap. Цитата Ну вот, а говорил нет. вру, в Racket есть Добавлено Цитата korvin @ прочитал более понятный пример, но вопрос: если нужен plist в объектах, почему бы сразу не спроектировать класс с таким свойством? а в случае наличия множественного наследования или примесей это вообще не проблема Не понял. Поясни, плиз. |
|
Сообщ.
#2447
,
|
|
|
|
Цитата D_KEY @ Когда языки с GC, которые ты знаешь(кроме Java и C#), по широте решаемых с помощью их задач приблизятся к тем же java и C#, тогда и поговорим. мм... распространенность как показатель качества? от тебя не ожидал =) Цитата D_KEY @ Ну вот, а говорил нет. одна имплементация... в R6RS, кстати, нет мягких ссылок Цитата D_KEY @ Не понял. Поясни, плиз. суть такова... Цитата A typical use case is storage of additional object attributes. Suppose you have a class with a fixed set of members, and, from the outside, you want to add more members. So you create a dictionary object -> attributes, where the keys are weak references. Then, the dictionary doesn't prevent the keys from being garbage collected; removal of the object should also trigger removal of the values in the WeakKeyDictionary (e.g. by means of a callback). собственно на мой взгляд лучше, гибче и очевидней делать словарь атрибутов сразу членом класса, либо примешивать когда надо к базовому классу Добавлено Цитата D_KEY @ Так ты можешь объяснить как? Или просто оставляем объект висеть в списке ?я все равно не до конца понимаю, что ты хочешь, можешь привести код? |
|
Сообщ.
#2448
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Когда языки с GC, которые ты знаешь(кроме Java и C#), по широте решаемых с помощью их задач приблизятся к тем же java и C#, тогда и поговорим. мм... распространенность как показатель качества? Не распространенность, а широта задач, в которых применяется язык. Чем уже сфера применения, тем меньше потребностей. Цитата Цитата D_KEY @ Не понял. Поясни, плиз. суть такова... Цитата A typical use case is storage of additional object attributes. Suppose you have a class with a fixed set of members, and, from the outside, you want to add more members. So you create a dictionary object -> attributes, where the keys are weak references. Then, the dictionary doesn't prevent the keys from being garbage collected; removal of the object should also trigger removal of the values in the WeakKeyDictionary (e.g. by means of a callback). собственно на мой взгляд лучше, гибче и очевидней делать словарь атрибутов сразу членом класса, либо примешивать когда надо к базовому классу Ну иногда ты уже имеешь и классы, и объекты... Но мне этот use-case не очень нравится... |
|
Сообщ.
#2449
,
|
|
|
|
Цитата D_KEY @ Не распространенность, а широта задач, в которых применяется язык. Чем уже сфера применения, тем меньше потребностей. дык ты про фактическое использование или потенциальное? ибо фактическое использование -- это распространенность и есть, а по потенциальной все языки общего назначения эквивалентны, а мы тут вроде других не обсуждаем Добавлено Цитата D_KEY @ Ну иногда ты уже имеешь и классы, и объекты... Ну иногда ты работаешь с ОО-системой, позволяющей изменять классы в рантайме... =) |
|
Сообщ.
#2450
,
|
|
|
|
Цитата korvin @ я все равно не до конца понимаю, что ты хочешь, можешь привести код? Да обычный observer. Например, тот же MVC. Виды регистрируются у модели, которая при изменении оповещает все зарегистрированные виды. Добавлено Цитата korvin @ Цитата D_KEY @ Не распространенность, а широта задач, в которых применяется язык. Чем уже сфера применения, тем меньше потребностей. дык ты про фактическое использование или потенциальное? ибо фактическое использование -- это распространенность и есть, а по потенциальной все языки общего назначения эквивалентны, а мы тут вроде других не обсуждаем Заранее все предусмотреть невозможно, иногда новые "фичи" языков и сред выполнения появляются в ответ на новые потребности их пользователей. Цитата Цитата D_KEY @ Ну иногда ты уже имеешь и классы, и объекты... Ну иногда ты работаешь с ОО-системой, позволяющей изменять классы в рантайме... =) Ужасные системы |
|
Сообщ.
#2451
,
|
|
|
|
Цитата D_KEY @ Ужасные системы ![]() гибкие системы Добавлено Цитата D_KEY @ Да обычный observer. Например, тот же MVC. Виды регистрируются у модели, которая при изменении оповещает все зарегистрированные виды. ну хз-хз, по мне так в большинстве случаев все равно нужно реализовывать некий метод unscribe, чтобы пользователь мог менять модели, его можно просто повесить выполняться при событии закрытия вида пользователем. Добавлено вот эти ![]() ![]() ... System.out.println( s1.toString() ); WeakReference<Student> ws = new WeakReference<Student>(s1); System.out.println( ws.get().toString() ); s1 = null; System.gc(); Thread.sleep(1000); System.out.println( ws.get().toString() ); ... ![]() ![]() Exception in thread "main" java.lang.NullPointerException at ReferenceTest.main(ReferenceTest.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115) |
|
Сообщ.
#2452
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Ужасные системы ![]() гибкие системы Иногда это слишком Цитата Цитата D_KEY @ Да обычный observer. Например, тот же MVC. Виды регистрируются у модели, которая при изменении оповещает все зарегистрированные виды. ну хз-хз, по мне так в большинстве случаев все равно нужно реализовывать некий метод unscribe, чтобы пользователь мог менять модели, его можно просто повесить выполняться при событии закрытия вида пользователем. Возможно MVC тут не самый лучший образец, но тем не менее. Иногда нужен такой observer, где такой метод вызвать будет некому. Или вот например когда тебе нужно сделать нечто вроде foreign key'ев . То есть есть у тебя пара списков, а есть третий, который содержит ссылки на объекты из первых двух. Например, ну даже не знаю... Список авторов, список книг и группа списков книг, в написании которой участвовал данный автор. Удаляем книгу и она автоматически "удаляется" из всех списков, где фигурирует(Или аналогичный пример с преподавателями/лекциями и студентами).Или вот пример из "книги Дракона": хеш-таблица идентификаторов, время жизни которой - вся стадия компиляции, а вот сами идентификаторы могут быть удалены из дерева разбора(при выходе идентификатора из его области видимости). Если хеш-таблица содержит мягкие ссылки, то проблем никаких нет. Если содержит жесткие, то необходимо вручную отслеживать "мертвые" объекты и удалять их из хеш-таблицы. Ку? Добавлено А, ты про это. Не имеют отношения к обсуждаемой проблеме |
|
Сообщ.
#2453
,
|
|
|
|
Цитата D_KEY @ Возможно MVC тут не самый лучший образец, но тем не менее. Иногда нужен такой observer, где такой метод вызвать будет некому. Или вот например когда тебе нужно сделать нечто вроде foreign key'ев . То есть есть у тебя пара списков, а есть третий, который содержит ссылки на объекты из первых двух. Например, ну даже не знаю... Список авторов, список книг и группа списков книг, в написании которой участвовал данный автор. Удаляем книгу и она автоматически "удаляется" из всех списков, где фигурирует(Или аналогичный пример с преподавателями/лекциями и студентами).Или вот пример из "книги Дракона": хеш-таблица идентификаторов, время жизни которой - вся стадия компиляции, а вот сами идентификаторы могут быть удалены из дерева разбора(при выходе идентификатора из его области видимости). Если хеш-таблица содержит мягкие ссылки, то проблем никаких нет. Если содержит жесткие, то необходимо вручную отслеживать "мертвые" объекты и удалять их из хеш-таблицы. Ку? в том-то и фишка, что полезны бывают только weak-коллекции, но не сами мягкие ссылки (конечно при отсутствии возможности самому использовать мягкие ссылки не получится и создавать своих мягких коллекций), проблема в том, что коллекция должна либо время от времени удалять нулевые ссылки, либо в своей реализации итератора "проходить" мимо них, хотя, думаю для сбалансированного дерева подойдет только удаление, причем при сборке объекта GC, иначе клиенту придется постоянно проверять валидность ссылки или получать NullPointerException в общем не все так просто, по-моему больше проблем, чем пользы. Или вот пример из SICP: идентификаторы хранятся в текущем окружении (хоть список, хоть хеш-таблица), время жизни которого -- область видимости. а как в примере из кД разруливается перекрытие идентификаторов, т.е.: ![]() ![]() { int x; { int x; } } ? или я неправильно понял пример из кД? =/ |
|
Сообщ.
#2454
,
|
|
|
|
Цитата korvin @ проблема в том, что коллекция должна либо время от времени удалять нулевые ссылки, либо в своей реализации итератора "проходить" мимо них, хотя, думаю для сбалансированного дерева подойдет только удаление, причем при сборке объекта GC, иначе клиенту придется постоянно проверять валидность ссылки или получать NullPointerException Ну проверишь В чем проблема-то?А в языках без сборки "weak_ptr" для "shared_ptr" помогает устранить проблему циклических зависимостей. Тут и коллекции не очень нужны... Цитата а как в примере из кД разруливается перекрытие идентификаторов, т.е.: ![]() ![]() { int x; { int x; } } ? Там это уже не обсуждается Просто приводится случай, когда бывают полезны мягкие ссылки. В общем, если среда времени выполнения, поддерживающая GC, предоставляет механизм слабых ссылок, то это плюс Поскольку нет-нет да и пригодится.И вообще напоминаю, что все началось с обсуждения "умных указателей", часто используемых в С++ программах Относительно же мягких ссылок, может кто-то из C# приведет пример их использования("Слабые события" и т.п.)? |
|
Сообщ.
#2455
,
|
|
|
|
Цитата D_KEY @ В общем, если среда времени выполнения, поддерживающая GC, предоставляет механизм слабых ссылок, то это плюс ![]() нет, т.к. это убивает один из бонусов GC: гарантия отсутствия невалидных ссылок. а польза от них слишком мала |
|
Сообщ.
#2456
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ В общем, если среда времени выполнения, поддерживающая GC, предоставляет механизм слабых ссылок, то это плюс ![]() нет, т.к. это убивает один из бонусов GC: гарантия отсутствия невалидных ссылок. Почему? Невалидных ссылок нет. WeakReference - специальный объект(который сам по себе тоже контролируется сборщиком), у которого ты запрашиваешь ссылку уже на другой объект, когда тебе нужно. |
|
Сообщ.
#2457
,
|
|
|
|
Цитата D_KEY @ Почему? Невалидных ссылок нет. WeakReference - специальный объект(который сам по себе тоже контролируется сборщиком), у которого ты запрашиваешь ссылку уже на другой объект, когда тебе нужно. только мне при этом нужно каждый раз проверять, что она не null возвращает. т.е. "не нужно -- не используй" -- это понятно, вытащил себе объект и юзай его. но как быть с чужими модулями? например кто-то написал такой класс ![]() ![]() import java.lang.ref.WeakReference; public class Foo { WeakReference<Student> ws; Foo (Student student) { ws = new WeakReference<Student>( new Student(1) ); } public String toString () { return String.format( "Foo %s", ws.get().toString() ); } } естественно реализацию мы не видим, в итоге опять получаем NullPointerException. да, еще, кстати, есть возможность перехватить объект из слабой ссылке после зануления последней жесткой ссылки, но до работы GC =) ![]() ![]() import java.lang.ref.WeakReference; public class ReferenceTest { static void D_KEY_Test () throws InterruptedException { //Student s1 = new Student(1); //System.out.println( s1.toString() ); WeakReference<Student> ws = new WeakReference<Student>(new Student(1)); System.out.println( ws.get().toString() ); /// It's working! =) //s1 = null; System.gc(); Thread.sleep(1000); //System.out.println( ws.get().toString() ); } static void korvin_Test () throws InterruptedException { Student s = new Student(1); Foo f = new Foo( s ); System.out.println( f ); s = null; System.gc(); Thread.sleep(1000); System.out.println( f ); } public static void main (String[] args) throws InterruptedException { korvin_Test(); } } class Student { int id; public Student (int id) { this.id = id; } public String toString () { return String.format( "[id = %d]", id ); } } |
|
Сообщ.
#2458
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Почему? Невалидных ссылок нет. WeakReference - специальный объект(который сам по себе тоже контролируется сборщиком), у которого ты запрашиваешь ссылку уже на другой объект, когда тебе нужно. только мне при этом нужно каждый раз проверять, что она не null возвращает. Нужно. А что не так-то? Цитата но как быть с чужими модулями? например кто-то написал такой класс Тебе не кажется, что он ССЗБ? |
|
Сообщ.
#2459
,
|
|
|
|
Цитата D_KEY @ Нужно. А что не так-то? так а что так-то? что в в этом хорошего? опять же механизм стат. проверок исключений не работает для такого кода по определенным причинам =/ Цитата D_KEY @ Тебе не кажется, что он ССЗБ? он может и да, только мне от этого не легче, я же использую его класс =) |
|
Сообщ.
#2460
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Нужно. А что не так-то? так а что так-то? что в в этом хорошего? А что плохого в том, что ты используешь объект, предназначенный для косвенного доступа к другим объектам, как объект, предназначенный для косвенного доступа ?Цитата Цитата D_KEY @ Тебе не кажется, что он ССЗБ? он может и да, только мне от этого не легче, я же использую его класс =) Никакие языковые правила не защитят тебя от идиотов. Он вообще и так способен кинуть тебе исключение. Без всяких мягких ссылок |