Re[9]: время жизни
От: Владик Россия  
Дата: 19.03.03 08:48
Оценка:
Здравствуйте, mrhru, Вы писали:

В>>В С++ существует автоматическое уничтожение объектов.

M>Не совсем правильно. Для объектов в стеке, а не в куче.

Стэк здесь не причем. Агрегируемые объекты также автоматически разрушаются, при этом агрегирующий объект может находится где угодно. В С++ вообще нет понятие стэка (или кто-нибудь ткнет меня носом в соответсвующее место стандарта?), есть понятие области видимости.

В>>Встроенная система уборки мусора есть, например, в джаве. То и другое (с ограничениями) есть в C#. Нету ни того ни другого в С...

M>Тоже неправильно. Объекты в стеке самоликвидируются.

Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно).

В>> (без плюсов), в этом плане он очень похож на дельфю

M>И это неправильно.

Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно?

В>> Но он при этом и на язык высокого уровня особо не претендует, скорее это "переносимый ассемблер".

M>Опять неправильно. С всегда относится к языкам высокого уровня.

Официально — да. По сравнению с другими языками высокого уровня — он имеет ну очень низкий уровень.
Как все запущенно...
Re[10]: время жизни
От: mrhru Россия  
Дата: 19.03.03 09:04
Оценка:
Здравствуйте, Владик, Вы писали:

В>>>В С++ существует автоматическое уничтожение объектов.

M>>Не совсем правильно. Для объектов в стеке, а не в куче.

В>Стэк здесь не причем. Агрегируемые объекты также автоматически разрушаются, при этом агрегирующий объект может находится где угодно. В С++ вообще нет понятие стэка (или кто-нибудь ткнет меня носом в соответсвующее место стандарта?), есть понятие области видимости.


В>>>Встроенная система уборки мусора есть, например, в джаве. То и другое (с ограничениями) есть в C#. Нету ни того ни другого в С...

M>>Тоже неправильно. Объекты в стеке самоликвидируются.

В>Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно).


Прототип объектов в С++ — структуры.

В>>> (без плюсов), в этом плане он очень похож на дельфю

M>>И это неправильно.

В>Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно?


В С нет возможности хоть как-то автоматизировать освобождение объектов, в Delphi — есть.

1) Это, уже упоминавшиеся, интерфейсы. Для них компилятор гарантирут вызовы виртуальных AddRef и Release объектов, которые "скрываются" за интерфейсами. И дело программистов — переопределить эти методы для подсчета ссылок. Так же как и в С++ smart pointers.

2) (Не самый удобный способ, но иногда очень полезный) Custom variants — компилятор, опять же на основании счетчиков ссылок, гарантирует удаление "ненужных" объектов.

3) Строки и динамические массивы. Хоть и непереопределяемые, но очень часто используемые.

В>>> Но он при этом и на язык высокого уровня особо не претендует, скорее это "переносимый ассемблер".

M>>Опять неправильно. С всегда относится к языкам высокого уровня.

В>Официально — да. По сравнению с другими языками высокого уровня — он имеет ну очень низкий уровень.

Тогда надо определиться с терминами.
Евгений
Re[7]: время жизни
От: ssm Россия  
Дата: 19.03.03 09:15
Оценка:
Здравствуйте, mrhru, Вы писали:

В>>... Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно.


M>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?


А встроенная то зачем, если она реализуема штатными средствами языка? Да и велосипедов, рулящих временем жизни объектов, создаваемых в куче, — предостаточно : std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )
Re[8]: время жизни
От: mrhru Россия  
Дата: 19.03.03 09:24
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, mrhru, Вы писали:


В>>>... Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно.


M>>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?


ssm>А встроенная то зачем, если она реализуема штатными средствами языка? Да и велосипедов, рулящих временем жизни объектов, создаваемых в куче, — предостаточно : std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )


Да я и не настаиваю.
Евгений
Re[11]: время жизни
От: Владик Россия  
Дата: 19.03.03 09:27
Оценка:
Здравствуйте, mrhru, Вы писали:

В>>Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно).

M>Прототип объектов в С++ — структуры.

Это лишь прототипы (так же как в паскале — записи). Понятие "разрушения" для структуры в С довольно абстрактно, никаких особых действий (типа вызова деструкторов) не происходит и сам компилятор не пытается что-то такое особенное сделать.

[...]
В>>Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно?
M>В С нет возможности хоть как-то автоматизировать освобождение объектов, в Delphi — есть.

Согласен, что-то в дельфях есть. Но судя по высказываниям в этой же ветке, пользоваться этим не всегда представляется возможным. Те же интерфейсы и Variant были сделаны в угоду удобства работы COM и вынесены на уровень языка. С одной стороны, кстати, дельфи как "язык программирования под винды" крайне привлекателен — многие виндовые заморочки вынесены на уровень языка и работать с ними, естественно, становится удобнее. Но с другой стороны — все эти рулезы остаются "заплатками" и не добавляют стройности самому языку.
Как все запущенно...
Re[8]: время жизни
От: Владик Россия  
Дата: 19.03.03 09:40
Оценка:
Здравствуйте, ssm, Вы писали:

M>>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?

ssm>А встроенная то зачем, если она реализуема штатными средствами языка?

Встроенная удобнее и, как правило, эффективнее.

ssm>Да и велосипедов, рулящих временем жизни объектов, создаваемых в куче, — предостаточно : std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )


Это не совсем сборка мусора. Это все вариации на тему автоматического уничтожения объектов. Пример сборщика мусора для С++ можно найти в одной из статей на этом сайте, там все несколько сложнее Насколько я помню, основная "громоздкость" заключалась в "регистрировании" объектов, подлежащих обработке сборщиком мусора.
Как все запущенно...
Re[12]: время жизни
От: mrhru Россия  
Дата: 19.03.03 09:44
Оценка:
Здравствуйте, Владик, Вы писали:

В>>>Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно).

M>>Прототип объектов в С++ — структуры.

В>Это лишь прототипы (так же как в паскале — записи). Понятие "разрушения" для структуры в С довольно абстрактно, никаких особых действий (типа вызова деструкторов) не происходит и сам компилятор не пытается что-то такое особенное сделать.


Да, согласен. Единственно, налогическом уровне — просто "удобно" так думать, что структуры удаляются. Иначе не избежать проблем при возврате адреса автоматической структуры.

В Delphi же, для структур вызывается код очистки, корректно удаляющий строки, динамические массивы, и вызывающий обработчики для интерфейсов и variant'ов.

В>[...]

В>>>Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно?
M>>В С нет возможности хоть как-то автоматизировать освобождение объектов, в Delphi — есть.

В>Согласен, что-то в дельфях есть.




В>Но судя по высказываниям в этой же ветке, пользоваться этим не всегда представляется возможным. Те же интерфейсы и Variant были сделаны в угоду удобства работы COM и вынесены на уровень языка.


Варианты — да, а интерфейсы были сделаны гораздо позже, чем было реализована поддержка СОМ/OLE.
И сами интерфейсы, как самостоятельная структура языка, очень даже "юзабельны" — как в Java или в C#.

В>С одной стороны, кстати, дельфи как "язык программирования под винды" крайне привлекателен — многие виндовые заморочки вынесены на уровень языка и работать с ними, естественно, становится удобнее. Но с другой стороны — все эти рулезы остаются "заплатками" и не добавляют стройности самому языку.


Поэтому некоторые и перетекают плавно на C#.Net.
Евгений
Re[9]: время жизни
От: ssm Россия  
Дата: 19.03.03 13:28
Оценка:
Здравствуйте, Владик, Вы писали:

В>Встроенная удобнее и, как правило, эффективнее.


И в чем было ее удобство(для С++)?

ssm>>std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )


В>Это не совсем сборка мусора.


а я и неговорил этого, я о управлении памятью для объектов сохданых в куче

В>Это все вариации на тему автоматического уничтожения объектов. Пример сборщика мусора для С++ можно найти в одной из статей на этом сайте, там все несколько сложнее Насколько я помню, основная "громоздкость" заключалась в "регистрировании" объектов, подлежащих обработке сборщиком мусора.


IMHO для С++ встроенный сборщик мусора — явное излишество
Re[10]: время жизни
От: Владик Россия  
Дата: 19.03.03 13:53
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>И в чем было ее удобство(для С++)?


Дык. В том, в чем удобство сборщика мусор вообще — за тобой все чистят (когда-нибудь). Хотя конкретно для С++ реализация сборщика мусора представляет скорее академический интерес. На практике вполне хватает упоминавшихся смарт-поинтеров и т.п.
Как все запущенно...
Re[6]: время жизни
От: s.ts  
Дата: 19.03.03 13:56
Оценка: 11 (1)
Здравствуйте, Владик, Вы писали:

В>Здравствуйте, s.ts, Вы писали:


ST>>Поддерживаю двумя руками

ST>>Тем более, что "ссылочная модель", фактически по возмозможностям является подмножеством множественного наследования + переопределение операторов (С++), но реализована на уровне компилятора.

В>Не понял. Что реализовано на уровне компилятора? И какое отношение ссылочная модель имеет к переопределению операторов?


М.б. я плохо выразился.
Просто в дельфи вызов Release делает компилятор, тогда как в С++ все то же самое реализуется за счет переопределения операции присваивания (непосредственно для класса или для какого-нибудь там SmartPointer-а). Подсчет ссылок в дельфи есть часть языка, а в С++ — реализуется средствами самого языка (в общем, нет в с++ [как в языке] понятия "подсчет ссылок" — это реализуется как часть библиотеки)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.