Re[9]: Сборщик мусора и размещение объектов в стеке
От: Cyberax Марс  
Дата: 18.12.07 06:07
Оценка:
Здравствуйте, Константин Л., Вы писали:

C>>>>Ты подумай, однако. "Стековые" объекты нельзя просто так класть в ref-классы, так как они уничтожаются в недетерминированое время.

КЛ>>>Так подумать над этой проблемой, или над тем, что слаще?
C>>То есть?
КЛ>Сначала ты с пафосом предлагал "дойти" до мысли, что это просто не нужно. Потом начал упирать на то, что это нереализуемо.
Не "не нужно", а "невозможно сделать правильно". А если делать только в тех случаях, когда _можно_ сделать правильно — получим или полный С++ или аналог using()'а.

КЛ>>>А вот волшебники взяли и заимплементили такую фичу в c++\cli

C>>Это вполне понятно, так как C++/CLI уже включает в себя все механизмы обычного С++ для управления памятью. А ты попробуй придумать как добиться того же, не повторяя половину С++.
КЛ>для этого не нужно ничего повторять.
Ну покажи как ты будешь стековые объекты с детерминированым деструкторами и ref-классы совмещать (без финализаторов — это хак).
Sapienti sat!
Re[5]: Сборщик мусора и размещение объектов в стеке
От: anton_t Россия  
Дата: 18.12.07 06:29
Оценка: :)
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Cyberax, Вы писали:


C>>Здравствуйте, Константин Л., Вы писали:


C>>>>А ты дальше подумай — что делать, если эта структура будет полем класса, уничтожение которого недетерминировано?

КЛ>>>И что? Если ее создали на стеке — ведет себя как стековый объект. Если нет — ну нет так нет. В C++\CLI именно так и работает.
C>>Осталось сделать следующий шаг, и понять, что стековые объекты не нужны — достаточно паттерна Disposable и сахара в виде using().

КЛ>Шаг к чему? К дао? Достаточно понять, что using менее сладок нежели стековые объекты.


Особенно сладки стековые объекты в С++, когда идёт отмотка стека из-за исключения и тут из деструктора вылетает новое исключение
Re[8]: Сборщик мусора и размещение объектов в стеке
От: FR  
Дата: 18.12.07 07:07
Оценка:
Здравствуйте, Cyberax, Вы писали:

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


C>>>ИМХО, совсем не оправдывает введение еще одной сущности.

FR>>А что для Вальтера лишняя сущность!
C>Ну да, после трех сортов константности от таких людей чего угодно можно ждать.


Угу если еще учесть что есть scope(exit) и т. п.

C>В _таком_ виде scope просто является другой записью using'а — я не против. Но зачем делать scope-классы — это уже мне не очень понятно.


Я одно хорошее примение вижу — гарантированный RAI объект который нельзя использовать в других целях

C>Там же целая гора проблем сразу возникает: как работает наследование, что произойдет при наследовании от обычного класса, и т.д.


Ну scope как вирус если определяешь то все потомки будут scope.
А наследоватся можно от любого класса.
Re[6]: Сборщик мусора и размещение объектов в стеке
От: remark Россия http://www.1024cores.net/
Дата: 18.12.07 07:15
Оценка:
Здравствуйте, anton_t, Вы писали:

_>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, Cyberax, Вы писали:


C>>>Здравствуйте, Константин Л., Вы писали:


C>>>>>А ты дальше подумай — что делать, если эта структура будет полем класса, уничтожение которого недетерминировано?

КЛ>>>>И что? Если ее создали на стеке — ведет себя как стековый объект. Если нет — ну нет так нет. В C++\CLI именно так и работает.
C>>>Осталось сделать следующий шаг, и понять, что стековые объекты не нужны — достаточно паттерна Disposable и сахара в виде using().

КЛ>>Шаг к чему? К дао? Достаточно понять, что using менее сладок нежели стековые объекты.


_>Особенно сладки стековые объекты в С++, когда идёт отмотка стека из-за исключения и тут из деструктора вылетает новое исключение



Если освобождения ресурсов/откаты действий могут не проходить, то в принципе нельзя добиться никакой осмысленной семантики, в частности консистентности нетривиальных данных.
Например, хотим добавить значения в 2 списка:

list1.push(v1);
try
{
  list2.push(v2);
}
catch (...)
{
  try
  {
    list1.pop();
  }
  catch (...)
  {
    //!!! <--------------
  }
}


В точке //!!! остаётся только убить себя об стену или выпить йада, ничего лучше придумать нельзя. Т.ч. возможное завершение программы на С++ при вылете исключения из конструктора есть вполне удобная вещь — автоматизация убивания об стену.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: Сборщик мусора и размещение объектов в стеке
От: Cyberax Марс  
Дата: 18.12.07 07:16
Оценка: 12 (1)
Здравствуйте, FR, Вы писали:

FR>Угу если еще учесть что есть scope(exit) и т. п.

scope(exit) — это тоже вполне нормальная идея, согласен.

C>>В _таком_ виде scope просто является другой записью using'а — я не против. Но зачем делать scope-классы — это уже мне не очень понятно.

FR>Я одно хорошее примение вижу — гарантированный RAI объект который нельзя использовать в других целях
RAII очень ограниченый получается — если мы не можем сохранять его в поля класса.

C>>Там же целая гора проблем сразу возникает: как работает наследование, что произойдет при наследовании от обычного класса, и т.д.

FR>Ну scope как вирус если определяешь то все потомки будут scope.
FR>А наследоватся можно от любого класса.
Ооо...
class Base
{
   Base()
   {
      someExternalVariable=this;
   }
};

scope class Derived : public Base
{
   Derived() : Base() //???
   {
   }
}

И вот таких шуток, если подумать, можно найти еще несколько штук.

Нет, при желании их можно решить — но это куча сложности добавится на пустом месте.
Sapienti sat!
Re[7]: Сборщик мусора и размещение объектов в стеке
От: anton_t Россия  
Дата: 18.12.07 07:49
Оценка: +1
Здравствуйте, remark, Вы писали:

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


_>>Здравствуйте, Константин Л., Вы писали:


КЛ>>>Здравствуйте, Cyberax, Вы писали:


C>>>>Здравствуйте, Константин Л., Вы писали:


C>>>>>>А ты дальше подумай — что делать, если эта структура будет полем класса, уничтожение которого недетерминировано?

КЛ>>>>>И что? Если ее создали на стеке — ведет себя как стековый объект. Если нет — ну нет так нет. В C++\CLI именно так и работает.
C>>>>Осталось сделать следующий шаг, и понять, что стековые объекты не нужны — достаточно паттерна Disposable и сахара в виде using().

КЛ>>>Шаг к чему? К дао? Достаточно понять, что using менее сладок нежели стековые объекты.


_>>Особенно сладки стековые объекты в С++, когда идёт отмотка стека из-за исключения и тут из деструктора вылетает новое исключение



R>Если освобождения ресурсов/откаты действий могут не проходить, то в принципе нельзя добиться никакой осмысленной семантики, в частности консистентности нетривиальных данных.

R>Например, хотим добавить значения в 2 списка:

R>
R>list1.push(v1);
R>try
R>{
R>  list2.push(v2);
R>}
R>catch (...)
R>{
R>  try
R>  {
R>    list1.pop();
R>  }
R>  catch (...)
R>  {
R>    //!!! <--------------
R>  }
R>}
R>


R>В точке //!!! остаётся только убить себя об стену или выпить йада, ничего лучше придумать нельзя. Т.ч. возможное завершение программы на С++ при вылете исключения из конструктора есть вполне удобная вещь — автоматизация убивания об стену.


Ага, мы убили себя, даже не залогировав ошибку, потому что логер доступен только выше по стэку. Не хотел бы я такое отлавливать.
Re[10]: Сборщик мусора и размещение объектов в стеке
От: FR  
Дата: 18.12.07 07:56
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>И вот таких шуток, если подумать, можно найти еще несколько штук.


Проверил:

import std.stdio;

class Base
{   
   static Base someExternalVariable;
    
    this()
    {
        writefln("Base constructor"); 
        someExternalVariable=this;
    }
   
   ~this()
    {    
        writefln("Base destructor ");
    }
    
    void Test()
    {
        writefln("Test");
    }
   
}

scope class Derived : Base
{
   this()
   {
       super();
   }
}


void main()
{
    {
    scope sc = new Derived();
    }
    
    writefln("end");
    
    Base.someExternalVariable.Test();
}


Словил AV

C>Нет, при желании их можно решить — но это куча сложности добавится на пустом месте.


Да тут недоработка.
Re[8]: Сборщик мусора и размещение объектов в стеке
От: remark Россия http://www.1024cores.net/
Дата: 18.12.07 08:35
Оценка: :)
Здравствуйте, anton_t, Вы писали:

R>>В точке //!!! остаётся только убить себя об стену или выпить йада, ничего лучше придумать нельзя. Т.ч. возможное завершение программы на С++ при вылете исключения из конструктора есть вполне удобная вещь — автоматизация убивания об стену.


_>Ага, мы убили себя, даже не залогировав ошибку, потому что логер доступен только выше по стэку. Не хотел бы я такое отлавливать.



Во-первых, большинство функций освобождения ресурсов/отката действий дают гарантию бессбойности, по вышеупомянутой причине.
Во-вторых, если всё же функция может провалиться, то попытаться залогировать это можно точно так же, как и залогировать любое другое событие в любой другой функции.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: Сборщик мусора и размещение объектов в стеке
От: Константин Л. Франция  
Дата: 18.12.07 08:57
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Константин Л., Вы писали:


C>>>>>Ты подумай, однако. "Стековые" объекты нельзя просто так класть в ref-классы, так как они уничтожаются в недетерминированое время.

КЛ>>>>Так подумать над этой проблемой, или над тем, что слаще?
C>>>То есть?
КЛ>>Сначала ты с пафосом предлагал "дойти" до мысли, что это просто не нужно. Потом начал упирать на то, что это нереализуемо.
C>Не "не нужно", а "невозможно сделать правильно". А если делать только в тех случаях, когда _можно_ сделать правильно — получим или полный С++ или аналог using()'а.

Что значит полный с++? Что-то я не догоняю.

КЛ>>>>А вот волшебники взяли и заимплементили такую фичу в c++\cli

C>>>Это вполне понятно, так как C++/CLI уже включает в себя все механизмы обычного С++ для управления памятью. А ты попробуй придумать как добиться того же, не повторяя половину С++.
КЛ>>для этого не нужно ничего повторять.
C>Ну покажи как ты будешь стековые объекты с детерминированым деструкторами и ref-классы совмещать (без финализаторов — это хак).

С финализатором как раз просто, а вот что делать в случае, когда объект реализует IDisposable. Что делать что делать. В финализаторе звать dtor автоматом (пусть компайлер зовет). В Dispose звать ручками. Тогда получится некий аналог IDisposable. Но я этого не отрицаю. Просто синтаксический сахарок.
Re[6]: Сборщик мусора и размещение объектов в стеке
От: Константин Л. Франция  
Дата: 18.12.07 09:01
Оценка:
Здравствуйте, anton_t, Вы писали:

[]

_>Особенно сладки стековые объекты в С++, когда идёт отмотка стека из-за исключения и тут из деструктора вылетает новое исключение


А ты возьми за правило, что деструкторы не должны кидать исключений. И вообще, пост твой не в тему.
Re[11]: Сборщик мусора и размещение объектов в стеке
От: Cyberax Марс  
Дата: 18.12.07 09:10
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>>>Сначала ты с пафосом предлагал "дойти" до мысли, что это просто не нужно. Потом начал упирать на то, что это нереализуемо.

C>>Не "не нужно", а "невозможно сделать правильно". А если делать только в тех случаях, когда _можно_ сделать правильно — получим или полный С++ или аналог using()'а.
КЛ>Что значит полный с++? Что-то я не догоняю.
Фича стековых объектов — детерминированое уничтожение. Чтобы стековые объекты были чем-то большим, чем записаный по-другому using(), нужно уметь эти объекты передавать по значению. А это потребует семантики оператора присваивания и копирующего конструктора. А это, в свою очередь, привлечет другие проблемы (например, захочется иметь ссылки на стековые объекты).

И если их попробовать решить — С++ и получим.

C>>Ну покажи как ты будешь стековые объекты с детерминированым деструкторами и ref-классы совмещать (без финализаторов — это хак).

КЛ>С финализатором как раз просто, а вот что делать в случае, когда объект реализует IDisposable. Что делать что делать. В финализаторе звать dtor автоматом (пусть компайлер зовет). В Dispose звать ручками. Тогда получится некий аналог IDisposable. Но я этого не отрицаю. Просто синтаксический сахарок.
И стоит ради такого сахара вводить еще одну фундаментальную сущность языка?
Sapienti sat!
Re[7]: Сборщик мусора и размещение объектов в стеке
От: anton_t Россия  
Дата: 18.12.07 09:47
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, anton_t, Вы писали:


КЛ>[]


_>>Особенно сладки стековые объекты в С++, когда идёт отмотка стека из-за исключения и тут из деструктора вылетает новое исключение


КЛ>А ты возьми за правило, что деструкторы не должны кидать исключений. И вообще, пост твой не в тему.


Действительно, прелести С++ это отдельный разговор
Re[7]: LOL
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка: :)))
Здравствуйте, remark, Вы писали:

R>Помедитируй над этим С++ кодом, и почувствуй какой бред ты говоришь.


R>
R>string f(string s)
R>{
R>  string s2 = f2();
R>  return s + s2 + "!";
R>}
R>


Помедитировал. Беру свои слова обратно. Для задач вроде этой С++ отлично подходит.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: LOL
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка:
Здравствуйте, remark, Вы писали:

Скажи, сколько способов управлению временем жизни объектов на С++ ты знаешь?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: LOL
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка:
Здравствуйте, FR, Вы писали:

FR>При выделении — освобождении памяти с хорошоим аллокатором как раз практически не надо, вот при доступе да приходится.


Само появление "хорошего аллокатора" говорит о том, что кто-то подумал об уарвлении памятью. Не так ли?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: LOL
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка: -1
Здравствуйте, remark, Вы писали:

R>Ты тоже считаешь, что С++ программисты большую часть своего времени проводят в безуспешных попытках залатать утечки ресурсов?


Тет, конечно. Большую часть своего времени они ловят баги.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Смотри шире
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка:
Здравствуйте, FR, Вы писали:


FR>Наверно о том что пример некорректный

FR>В программе занимающейся пакетными расчетами управление ресурсами кроме памяти (GC) и доступа к файлам (который несложно автоматизировать) и не нужно.

А где те программы в которых учет реусурсво становится проблемой?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Смотри шире
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка:
Здравствуйте, remark, Вы писали:

R>Да, это ж компилятор.


И что с того?

R> Ты б ещё какую-нибудь утилиту вспомогательную взял.

R>Если там и эти using убрать никто ничего и не заметит.

Этот компилятор работая в режиме Intellisese не выгружается из памяти сутками и постоянно перезагружает части файлов.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Сборщик мусора и размещение объектов в стеке
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка:
Здравствуйте, FR, Вы писали:

FR>Ну в D тоже есть, но там сделали чуть умнее чем в C++/CLI, есть ключевое слово scope, если класс обявлен как scope, то он может жить только на стеке, и объявить его например членом класса не выйдет, кроме того переменную любого класса можно заставить жить на стеке объявив с модификатором scope:


Возможно поэтому Ди не не является С++-ом? Не задумывался над этим?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Сборщик мусора и размещение объектов в стеке
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.12.07 16:01
Оценка:
Здравствуйте, FR, Вы писали:

FR>Тем что жестче контроль и разделение. Случайно объявить не там где нужно такой класс не возможно.


Готов согласиться с твоим доводами. Но исходный вопрос все же остается. Почему контроль ресурсов не достает орды разработчиков на Яве и дотнете?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.