Здравствуйте, mrhru, Вы писали:
В>>В С++ существует автоматическое уничтожение объектов. M>Не совсем правильно. Для объектов в стеке, а не в куче.
Стэк здесь не причем. Агрегируемые объекты также автоматически разрушаются, при этом агрегирующий объект может находится где угодно. В С++ вообще нет понятие стэка (или кто-нибудь ткнет меня носом в соответсвующее место стандарта?), есть понятие области видимости.
В>>Встроенная система уборки мусора есть, например, в джаве. То и другое (с ограничениями) есть в C#. Нету ни того ни другого в С... M>Тоже неправильно. Объекты в стеке самоликвидируются.
Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно).
В>> (без плюсов), в этом плане он очень похож на дельфю M>И это неправильно.
Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно?
В>> Но он при этом и на язык высокого уровня особо не претендует, скорее это "переносимый ассемблер". M>Опять неправильно. С всегда относится к языкам высокого уровня.
Официально — да. По сравнению с другими языками высокого уровня — он имеет ну очень низкий уровень.
Здравствуйте, Владик, Вы писали:
В>>>В С++ существует автоматическое уничтожение объектов. M>>Не совсем правильно. Для объектов в стеке, а не в куче.
В>Стэк здесь не причем. Агрегируемые объекты также автоматически разрушаются, при этом агрегирующий объект может находится где угодно. В С++ вообще нет понятие стэка (или кто-нибудь ткнет меня носом в соответсвующее место стандарта?), есть понятие области видимости.
В>>>Встроенная система уборки мусора есть, например, в джаве. То и другое (с ограничениями) есть в C#. Нету ни того ни другого в С... M>>Тоже неправильно. Объекты в стеке самоликвидируются.
В>Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно).
Прототип объектов в С++ — структуры.
В>>> (без плюсов), в этом плане он очень похож на дельфю M>>И это неправильно.
В>Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно?
В С нет возможности хоть как-то автоматизировать освобождение объектов, в Delphi — есть.
1) Это, уже упоминавшиеся, интерфейсы. Для них компилятор гарантирут вызовы виртуальных AddRef и Release объектов, которые "скрываются" за интерфейсами. И дело программистов — переопределить эти методы для подсчета ссылок. Так же как и в С++ smart pointers.
2) (Не самый удобный способ, но иногда очень полезный) Custom variants — компилятор, опять же на основании счетчиков ссылок, гарантирует удаление "ненужных" объектов.
3) Строки и динамические массивы. Хоть и непереопределяемые, но очень часто используемые.
В>>> Но он при этом и на язык высокого уровня особо не претендует, скорее это "переносимый ассемблер". M>>Опять неправильно. С всегда относится к языкам высокого уровня.
В>Официально — да. По сравнению с другими языками высокого уровня — он имеет ну очень низкий уровень.
Тогда надо определиться с терминами.
Здравствуйте, mrhru, Вы писали:
В>>... Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно.
M>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?
А встроенная то зачем, если она реализуема штатными средствами языка? Да и велосипедов, рулящих временем жизни объектов, создаваемых в куче, — предостаточно : std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )
Здравствуйте, ssm, Вы писали:
ssm>Здравствуйте, mrhru, Вы писали:
В>>>... Потому как отсутствие автоматического уничтожения объектов, наряду с отстутствием какой-либо системы сборки мусора, для современного прикладного языка высокого уровня — просто несерьезно.
M>>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче?
ssm>А встроенная то зачем, если она реализуема штатными средствами языка? Да и велосипедов, рулящих временем жизни объектов, создаваемых в куче, — предостаточно : std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )
Здравствуйте, mrhru, Вы писали:
В>>Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно). M>Прототип объектов в С++ — структуры.
Это лишь прототипы (так же как в паскале — записи). Понятие "разрушения" для структуры в С довольно абстрактно, никаких особых действий (типа вызова деструкторов) не происходит и сам компилятор не пытается что-то такое особенное сделать.
[...] В>>Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно? M>В С нет возможности хоть как-то автоматизировать освобождение объектов, в Delphi — есть.
Согласен, что-то в дельфях есть. Но судя по высказываниям в этой же ветке, пользоваться этим не всегда представляется возможным. Те же интерфейсы и Variant были сделаны в угоду удобства работы COM и вынесены на уровень языка. С одной стороны, кстати, дельфи как "язык программирования под винды" крайне привлекателен — многие виндовые заморочки вынесены на уровень языка и работать с ними, естественно, становится удобнее. Но с другой стороны — все эти рулезы остаются "заплатками" и не добавляют стройности самому языку.
Здравствуйте, ssm, Вы писали:
M>>А в С++ существует какая-либо встроенная система уборки мусора для объектов создаваемых в куче? ssm>А встроенная то зачем, если она реализуема штатными средствами языка?
Встроенная удобнее и, как правило, эффективнее.
ssm>Да и велосипедов, рулящих временем жизни объектов, создаваемых в куче, — предостаточно : std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )
Это не совсем сборка мусора. Это все вариации на тему автоматического уничтожения объектов. Пример сборщика мусора для С++ можно найти в одной из статей на этом сайте, там все несколько сложнее Насколько я помню, основная "громоздкость" заключалась в "регистрировании" объектов, подлежащих обработке сборщиком мусора.
Здравствуйте, Владик, Вы писали:
В>>>Начнем с того, что в С нет объектов. Или уточни, что ты понимаешь под объектами (с философской точки зрения это может быть что угодно). M>>Прототип объектов в С++ — структуры.
В>Это лишь прототипы (так же как в паскале — записи). Понятие "разрушения" для структуры в С довольно абстрактно, никаких особых действий (типа вызова деструкторов) не происходит и сам компилятор не пытается что-то такое особенное сделать.
Да, согласен. Единственно, налогическом уровне — просто "удобно" так думать, что структуры удаляются. Иначе не избежать проблем при возврате адреса автоматической структуры.
В Delphi же, для структур вызывается код очистки, корректно удаляющий строки, динамические массивы, и вызывающий обработчики для интерфейсов и variant'ов.
В>[...] В>>>Что неправильно? Необходимость ручного управления ресурсами без возможности хоть как-то автоматизировать их освобождение? Где неправильно? M>>В С нет возможности хоть как-то автоматизировать освобождение объектов, в Delphi — есть.
В>Согласен, что-то в дельфях есть.
В>Но судя по высказываниям в этой же ветке, пользоваться этим не всегда представляется возможным. Те же интерфейсы и Variant были сделаны в угоду удобства работы COM и вынесены на уровень языка.
Варианты — да, а интерфейсы были сделаны гораздо позже, чем было реализована поддержка СОМ/OLE.
И сами интерфейсы, как самостоятельная структура языка, очень даже "юзабельны" — как в Java или в C#.
В>С одной стороны, кстати, дельфи как "язык программирования под винды" крайне привлекателен — многие виндовые заморочки вынесены на уровень языка и работать с ними, естественно, становится удобнее. Но с другой стороны — все эти рулезы остаются "заплатками" и не добавляют стройности самому языку.
Здравствуйте, Владик, Вы писали:
В>Встроенная удобнее и, как правило, эффективнее.
И в чем было ее удобство(для С++)?
ssm>>std::auto_ptr( ), boost::shared_ptr( ), Loki::SmartPtr( )
В>Это не совсем сборка мусора.
а я и неговорил этого, я о управлении памятью для объектов сохданых в куче
В>Это все вариации на тему автоматического уничтожения объектов. Пример сборщика мусора для С++ можно найти в одной из статей на этом сайте, там все несколько сложнее Насколько я помню, основная "громоздкость" заключалась в "регистрировании" объектов, подлежащих обработке сборщиком мусора.
IMHO для С++ встроенный сборщик мусора — явное излишество
Здравствуйте, ssm, Вы писали:
ssm>И в чем было ее удобство(для С++)?
Дык. В том, в чем удобство сборщика мусор вообще — за тобой все чистят (когда-нибудь). Хотя конкретно для С++ реализация сборщика мусора представляет скорее академический интерес. На практике вполне хватает упоминавшихся смарт-поинтеров и т.п.
Здравствуйте, Владик, Вы писали:
В>Здравствуйте, s.ts, Вы писали:
ST>>Поддерживаю двумя руками ST>>Тем более, что "ссылочная модель", фактически по возмозможностям является подмножеством множественного наследования + переопределение операторов (С++), но реализована на уровне компилятора.
В>Не понял. Что реализовано на уровне компилятора? И какое отношение ссылочная модель имеет к переопределению операторов?
М.б. я плохо выразился.
Просто в дельфи вызов Release делает компилятор, тогда как в С++ все то же самое реализуется за счет переопределения операции присваивания (непосредственно для класса или для какого-нибудь там SmartPointer-а). Подсчет ссылок в дельфи есть часть языка, а в С++ — реализуется средствами самого языка (в общем, нет в с++ [как в языке] понятия "подсчет ссылок" — это реализуется как часть библиотеки)