|
|
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
тыц ну и насколько обоснованна детерминированная сборка мелких объектов? конечно если их на стеке располагать. а так потеря проиводительности... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2009, 14:32 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
Ынтырпрайзз, Что-то тебя давненько видно не было ) Он не предлагает сборку мусора, он предлагает подобие сишарпового using. К потере производительности это не ведет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2009, 14:59 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Ничего, что я поднял такую старую тему? вот мой вариант реализации данной фичи. "На стеке" можно разместить любой потомок TOBject, но можно сделать и для других типов. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Здесь это кажется не слишком лаконичным по сравнению с Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. однако в менее тривиальных случаях выигрываем из-за того, что уменьшается вложенность кода, а действия по уничтожению объекта не отрываются от места его создания, что увеличивает ясность кода. Кроме того, если объектов больше одного, то обрамление пишется один раз: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Соответственно, можно писать разного рода хранители ресурсов, например: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. код прилагается. Я постоянно пользуюсь им в D2007 и уже давно не пишу для таких случаев try...finally Собственно, я сюда зашёл посмотреть, нет ли где-нибудь реализованной полноценной сборки мусора для Delphi. Видимо, нет? Можно ли, интересно, сделать её в таком же стиле? Что-нибудь вроде: Код: pascal 1. 2. 3. 4. 5. я думаю, что можно. А Вы как думаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 13:55 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
сорри, в последнем примере процедуру test читать так: Код: pascal 1. 2. 3. 4. 5. 6. 7. на счастье, в реальной жизни компилятор выдаст предупреждение, если забыть эту строчку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 14:00 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
buddenя думаю, что можно. А Вы как думаете?Вместо этого Код: pascal 1. 2. 3. 4. 5. 6. Можно использовать TObjectList. С той же функциональностью. Или я Вас не понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 14:19 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, про TObjectList я узнал две недели назад, а приложенному коду - два года примерно. Меня отчасти оправдывает то, что я писал ещё на первой версии Delphi, а TObjectList появился не сразу, когда я уже умел без него обходиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 14:25 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, а кстати, даже, если бы и знал, всё равно написал бы так же. Во-первых, TObjectList разве гарантирует порядок удаления объектов? Во-вторых, в моём коде можно поставить брекпойнт или сделать вывод в лог, если что-то пойдёт не так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 14:28 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
buddenTObjectList разве гарантирует порядок удаления объектов?Да, но это никому не нужно buddenв моём коде можно поставить брекпойнт или сделать вывод в лог, если что-то пойдёт не такАналогично с TObjectList И еще, из того, что процедура называется OnStack не следует автоматически, что она работает со стеком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 15:53 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, > Аналогично с TObjectList Я, честно сказать, не в курсе. Мне всегда казалось, что нельзя так просто взять и поменять класс, входящий в VCL, может быть, я не в курсе. Т.е., лог только через установку брекпойнта с условием, а это - недостаточно гибко и удобно меня. >Да, но это никому не нужно А вот здесь Вы меня не поняли. >OnStack не следует автоматически, что она работает со стеком. Она с ним и не работает, Вы ж исходник читали, как я понял? Кроме того, слова "на стеке" я недаром заключил в кавычки. Смысл Вашего высказывания в чём? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 16:01 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
budden, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. А почему х там будет уничтожен? ЧТо его на выходе из процедуры уничтожит? OnStack посмотрел, там как я понял добавление в "стэк" и чо? Пока не видать чего-то такого, за что "нужно брать деньги за стажеровку у нас". "однако в менее тривиальных случаях выигрываем из-за того, что уменьшается вложенность кода, а действия по уничтожению объекта не отрываются от места его создания, что увеличивает ясность кода. Кроме того, если объектов больше одного, то обрамление пишется один раз:" Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. мне вот интересно, да ушли от одной(!) вложенности, а как будут высвобождаться ресурсы в случае ошибок в x:=TExampleObject.Create или x.example? Да и ясность кода нестандартные решения НИКОГДА не повышают. Посмотрел код, деструкторы в цепочку вызываются, а что будет если в среднем деструкторе ексепшен высыпится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 18:33 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
Иванов Александр Александрович, > А почему х там будет уничтожен? То, что Вы посмотрели исходник, где всё написано, и не поняли, как раз и означает, что с Вас вполне уместно > брать деньги за стажировку у нас ;) > Посмотрел код, деструкторы в цепочку вызываются, а что будет если в среднем деструкторе ексепшен высыпится? Вы правы в том, что поведение в этом случае отличается от try..finally. Я думаю, эксепшн в деструкторе - это в любом случае нехорошо и такого быть не должно. Здесь последующие деструкторы не вызовутся, но я не думаю, что это большая беда по сравнению с самим фактом экспешена в деструкторе. Наверное, можно поменять логику так, чтобы исключения в деструкторе не препятствовали вызову последующих деструкторов. В моей практике пока эта особенность не вызывала проблем, т.к. эксепшн в деструкторе для меня означает плохой код, который нужно исправлять. Хотя тут действительно есть о чём подумать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 20:25 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
buddenЯ, честно сказать, не в курсе. Мне всегда казалось, что нельзя так просто взять и поменять класс, входящий в VCL,Наследование запретили? buddenА вот здесь Вы меня не поняли.Попробуйте привести пример когда важен порядок уничтожения объектов buddenслова "на стеке" я недаром заключил в кавычки.Тогда вопросов больше не имею buddenТо, что Вы посмотрели исходник, где всё написано, и не поняли, как раз и означает, что с Вас вполне уместноЭто означает, что лучше бы Вам быть как можно дальше от того, кто возьмется сопровождать Ваш код. И лучше всего - в бетонном бункере. Сам стиль кода не плохой. Он ужасен Хотите сборку мусора - используйте интерфейсы. Все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 20:43 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, в целом, я понял, что Вы сегодня ещё ни об кого не вытирали ноги, и именно в этом состоит цель Вашего пребывания в данной теме. Но у Вас плохо получилось, потому что вот этот вопрос > Попробуйте привести пример когда важен порядок уничтожения объектов - просто идиотский. Думаю, Вам стоит подумать о смене профессии. В качестве прикола, предлагаю Вам привести пример того же кода с интерфейсами и мы посмотрим, какой код выглядит страшнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 21:00 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
На всякий случай, чтобы никто не был сбит с толку кавычками, повторяю: несмотря на то, что объекты не размещаются на стеке, они, тем не менее, уничтожаются при выходе переменной fr из области видимости, в порядке, обратном порядку вызова для них функции onStack и это является достаточно точной аналогией размещения на стеке в С с точки зрения времени жизни объекта. С точки зрения работы с памятью ситуация, конечно, другая, объекты размещаются в куче, как и обычно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 21:08 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
buddenДумаю, Вам стоит подумать о смене профессии. Обязательно подумаю. Спасибо за идею ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 21:28 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
Может я чего не догоняю, но зачем так сложно? Разве то, что у вас там понаписано чем то отличается от подобного: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ? Если порядок уничтожения важен - можно перекрыть деструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 22:15 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
Только я бы еще сделал так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2012, 22:17 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
В JCL ( JclSysUtils.pas (см. секцию Guards) есть попытка реализовать автоосвобождение объектов. В виде таких методов: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. http://wiki.delphi-jedi.org/wiki/JCL_Help:Guard@Pointer@IMultiSafeGuard]Описание методов в Jedi Wiki . Интерфейсы выглядят так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 01:56 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
buddenИванов Александр Александрович, > А почему х там будет уничтожен? То, что Вы посмотрели исходник, где всё написано, и не поняли, как раз и означает, что с Вас вполне уместно > брать деньги за стажировку у нас ;) > Посмотрел код, деструкторы в цепочку вызываются, а что будет если в среднем деструкторе ексепшен высыпится? Вы правы в том, что поведение в этом случае отличается от try..finally. Я думаю, эксепшн в деструкторе - это в любом случае нехорошо и такого быть не должно. Здесь последующие деструкторы не вызовутся, но я не думаю, что это большая беда по сравнению с самим фактом экспешена в деструкторе. Наверное, можно поменять логику так, чтобы исключения в деструкторе не препятствовали вызову последующих деструкторов. В моей практике пока эта особенность не вызывала проблем, т.к. эксепшн в деструкторе для меня означает плохой код, который нужно исправлять. Хотя тут действительно есть о чём подумать... Твой говнокод c помощью блокнота разобрать практически невозможно. Это короче не важно, важно другое. П моемому мнению, применять нестандартные решения в стандартных ситуациях, к добру не приведет. Да и зачем использовать подсчет ссылок на интерфейсы когда куда более естественным решением является try finally. Добавлять неясности в коде, ради того, чтобы уйти от одной вложенности - к надежности не приведет. Есть же правило, что достижение качества кода идет через снижение сложности. Мне куда понятней try finaly, нежели ковыряние в каком-то модуле на дредмет того, что делает OnStack. А вто тут: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. mkStackFr - глобальная переменная? Тогда если например три подобных процедуры будут вызваны, освобождение первых двух будет когда только третья закончится? Или еще какие-то подводные камни я не учел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 10:12 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
А, понял, mkStackFr оказывается функция. Последний вопрос снимается с повестки, но вопрос про стиль еще больше возникает. Смешались люди, интерфейсы, ООП, процедурное программирование...=) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 10:21 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
А я думаю, что в Delphi механизм уборки мусора появится в "базе", в скором времени, так что не надо бежать впереди паровоза. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 10:24 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
[quot budden]однако в менее тривиальных случаях выигрываем из-за того, что уменьшается вложенность кода, а действия по уничтожению объекта не отрываются от места его создания, что увеличивает ясность кода. Кроме того, если объектов больше одного, то обрамление пишется один раз: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 10:33 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
Херней занимаетесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 10:35 |
|
||
|
делфинист предлагает сборку мусора
|
|||
|---|---|---|---|
|
#18+
чччДХерней занимаетесь. Вынужден с прискорбием согласиться ))) Надо руками - finally. Надо автоматом - interface. Надо потрахаться на пустом месте - ну выдумывайте чё хотите, только покуда нет внятного результата и бонуса - лучше не публиковаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2012, 11:36 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=36017149&tid=2038816]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 351ms |

| 0 / 0 |
