Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / делфинист предлагает сборку мусора / 25 сообщений из 78, страница 1 из 4
30.05.2009, 14:32
    #36017149
Ынтырпрайзз
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
тыц

ну и насколько обоснованна детерминированная сборка мелких объектов? конечно если их на стеке располагать. а так потеря проиводительности...
...
Рейтинг: 0 / 0
30.05.2009, 14:59
    #36017163
clihlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
Ынтырпрайзз,

Что-то тебя давненько видно не было )

Он не предлагает сборку мусора, он предлагает подобие сишарпового using.
К потере производительности это не ведет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.07.2012, 13:55
    #37870593
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
Доброго времени суток. Ничего, что я поднял такую старую тему?
вот мой вариант реализации данной фичи.
"На стеке" можно разместить любой потомок TOBject, но можно сделать
и для других типов.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
uses stackUtil; 
...
procedure testStackFrame;
var x:TExampleObject; fr:stackFr;
begin
fr:=mkStackFr;
x:=TExampleObject.Create;
onStack(x);
x.example;
end // здесь x будет уничтожен



Здесь это кажется не слишком лаконичным по сравнению с
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure testTryFinally;
var x:TExampleObject; 
begin
x:=TExampleObject.Create;
try 
  x.example;
finally 
  freeAndNil(x); // здесь x будет уничтожен
  end;
end 



однако в менее тривиальных случаях выигрываем
из-за того, что уменьшается вложенность кода, а действия по уничтожению
объекта не отрываются от места его создания, что увеличивает ясность кода. Кроме того,
если объектов больше одного, то обрамление пишется один раз:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure testStackFrame;
var x,y:TExampleObject; fr:stackFr;
begin
fr:=mkStackFr;
x:=TExampleObject.Create; onStack(x);
y:=TExampleObject.Create; onStack(y); 
x.example;
y.example; 
end // здесь будет уничтожен сначала y, а потом - x.



Соответственно, можно писать разного рода хранители ресурсов,
например:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure setDefaultTransaction(aTransaction:TObject);
begin
g_database.defaultTransaction:=aTransaction as TpFIBTransaction;
end;

procedure withDefaultTransaction(tr:TpFIBTransaction);
begin
finallyDoo(setDefaultTransaction,g_database.defaultTransaction);
if tr.defaultDatabase<>g_database then tr.defaultDatabase:=g_database;
g_database.defaultTransaction:=tr;
end;

procedure test;
var fr:stackFr;
begin
withDefaultTransaction(myWriteTransaction);//запоминаем транзакцию и ставим свою
writeToDatabase;
end; // здесь будет восстановлена старая транзакция



код прилагается. Я постоянно пользуюсь им в D2007
и уже давно не пишу для таких случаев try...finally

Собственно, я сюда зашёл посмотреть, нет ли где-нибудь реализованной полноценной сборки мусора для Delphi.
Видимо, нет?

Можно ли, интересно, сделать её в таком же стиле? Что-нибудь вроде:
Код: pascal
1.
2.
3.
4.
5.
procedure testHeap; 
var o:TComponent;
begin
o:=TComponent.Create(nil); onHeap(o); 
end;


я думаю, что можно. А Вы как думаете?
...
Рейтинг: 0 / 0
08.07.2012, 14:00
    #37870596
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
сорри, в последнем примере процедуру test читать так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure test;
var fr:stackFr;
begin
fr:=mkStackFr;
withDefaultTransaction(myWriteTransaction);//запоминаем транзакцию и ставим свою
writeToDatabase;
end;



на счастье, в реальной жизни компилятор выдаст предупреждение, если забыть эту строчку.
...
Рейтинг: 0 / 0
08.07.2012, 14:19
    #37870600
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
buddenя думаю, что можно. А Вы как думаете?Вместо этого
Код: pascal
1.
2.
3.
4.
5.
6.
for i:=l.count-1 downto 0 do
  begin
  o:=l[i];
  FreeAndNil(o);
  end;
FreeAndNil(l);

Можно использовать TObjectList. С той же функциональностью. Или я Вас не понял
...
Рейтинг: 0 / 0
08.07.2012, 14:25
    #37870603
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
_Vasilisk_, про TObjectList я узнал две недели назад, а приложенному коду - два года примерно. Меня отчасти оправдывает то, что я писал ещё на первой версии Delphi, а TObjectList появился не сразу, когда я уже умел без него обходиться.
...
Рейтинг: 0 / 0
08.07.2012, 14:28
    #37870605
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
_Vasilisk_,
а кстати, даже, если бы и знал, всё равно написал бы так же.
Во-первых, TObjectList разве гарантирует порядок удаления объектов?
Во-вторых, в моём коде можно поставить брекпойнт или сделать вывод в лог, если
что-то пойдёт не так.
...
Рейтинг: 0 / 0
08.07.2012, 15:53
    #37870644
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
buddenTObjectList разве гарантирует порядок удаления объектов?Да, но это никому не нужно
buddenв моём коде можно поставить брекпойнт или сделать вывод в лог, если
что-то пойдёт не такАналогично с TObjectList

И еще, из того, что процедура называется OnStack не следует автоматически, что она работает со стеком.
...
Рейтинг: 0 / 0
08.07.2012, 16:01
    #37870646
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
_Vasilisk_,

> Аналогично с TObjectList
Я, честно сказать, не в курсе. Мне всегда казалось, что нельзя так просто взять и поменять
класс, входящий в VCL, может быть, я не в курсе. Т.е., лог только через установку
брекпойнта с условием, а это - недостаточно гибко и удобно меня.

>Да, но это никому не нужно
А вот здесь Вы меня не поняли.

>OnStack не следует автоматически, что она работает со стеком.
Она с ним и не работает, Вы ж исходник читали, как я понял? Кроме того,
слова "на стеке" я недаром заключил в кавычки. Смысл Вашего
высказывания в чём?
...
Рейтинг: 0 / 0
08.07.2012, 18:33
    #37870700
Иванов Александр Александрович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
budden,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure testStackFrame;
var x:TExampleObject; fr:stackFr;
begin
fr:=mkStackFr;
x:=TExampleObject.Create;
onStack(x);
x.example;
end // здесь x будет уничтожен


А почему х там будет уничтожен? ЧТо его на выходе из процедуры уничтожит? OnStack посмотрел, там как я понял добавление в "стэк" и чо?
Пока не видать чего-то такого, за что "нужно брать деньги за стажеровку у нас".

"однако в менее тривиальных случаях выигрываем
из-за того, что уменьшается вложенность кода, а действия по уничтожению
объекта не отрываются от места его создания, что увеличивает ясность кода. Кроме того,
если объектов больше одного, то обрамление пишется один раз:"
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure testStackFrame;
var x,y:TExampleObject; fr:stackFr;
begin
fr:=mkStackFr;
x:=TExampleObject.Create; onStack(x);
y:=TExampleObject.Create; onStack(y); 
x.example;
y.example; 
end 


мне вот интересно, да ушли от одной(!) вложенности, а как будут высвобождаться ресурсы в случае ошибок в x:=TExampleObject.Create или x.example? Да и ясность кода нестандартные решения НИКОГДА не повышают.
Посмотрел код, деструкторы в цепочку вызываются, а что будет если в среднем деструкторе ексепшен высыпится?
...
Рейтинг: 0 / 0
08.07.2012, 20:25
    #37870770
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
Иванов Александр Александрович,
> А почему х там будет уничтожен?
То, что Вы посмотрели исходник, где всё написано, и не поняли, как раз и означает, что с Вас вполне уместно
> брать деньги за стажировку у нас
;)
> Посмотрел код, деструкторы в цепочку вызываются, а что будет если в среднем деструкторе ексепшен высыпится?
Вы правы в том, что поведение в этом случае отличается от try..finally.

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

Хотя тут действительно есть о чём подумать...
...
Рейтинг: 0 / 0
08.07.2012, 20:43
    #37870779
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
buddenЯ, честно сказать, не в курсе. Мне всегда казалось, что нельзя так просто взять и поменять
класс, входящий в VCL,Наследование запретили?
buddenА вот здесь Вы меня не поняли.Попробуйте привести пример когда важен порядок уничтожения объектов
buddenслова "на стеке" я недаром заключил в кавычки.Тогда вопросов больше не имею
buddenТо, что Вы посмотрели исходник, где всё написано, и не поняли, как раз и означает, что с Вас вполне уместноЭто означает, что лучше бы Вам быть как можно дальше от того, кто возьмется сопровождать Ваш код. И лучше всего - в бетонном бункере. Сам стиль кода не плохой. Он ужасен

Хотите сборку мусора - используйте интерфейсы. Все
...
Рейтинг: 0 / 0
08.07.2012, 21:00
    #37870790
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
_Vasilisk_, в целом, я понял, что Вы сегодня ещё ни об кого не вытирали ноги, и именно в этом состоит цель Вашего пребывания в данной теме. Но у Вас плохо получилось, потому что вот этот вопрос
> Попробуйте привести пример когда важен порядок уничтожения объектов
- просто идиотский. Думаю, Вам стоит подумать о смене профессии.
В качестве прикола, предлагаю Вам привести пример того же кода с интерфейсами и мы посмотрим, какой код выглядит страшнее.
...
Рейтинг: 0 / 0
08.07.2012, 21:08
    #37870795
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
На всякий случай, чтобы никто не был сбит с толку кавычками, повторяю: несмотря на то, что объекты не размещаются на стеке, они, тем не менее, уничтожаются при выходе переменной fr из области видимости, в порядке, обратном порядку вызова для них функции onStack и это является достаточно точной аналогией размещения на стеке в С с точки зрения времени жизни объекта. С точки зрения работы с памятью ситуация, конечно, другая, объекты размещаются в куче, как и обычно.
...
Рейтинг: 0 / 0
08.07.2012, 21:28
    #37870818
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
buddenДумаю, Вам стоит подумать о смене профессии. Обязательно подумаю. Спасибо за идею
...
Рейтинг: 0 / 0
08.07.2012, 22:15
    #37870862
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
Может я чего не догоняю, но зачем так сложно?

Разве то, что у вас там понаписано чем то отличается от подобного:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
type
  IMyStack = interface
    function Add(AObject: TObject): Integer;
  end;

  TMyStack = class(TObjectList, IMyStack)
    ...
  end;

procedure Some;
var
  F :IMyStack
  x,y :TExampleObject;
begin
  F := TMyStack.Create;

  x := TExampleObject.Create; F.Add(x);
  y := TExampleObject.Create; F.Add(y);
  //...

end; 



?

Если порядок уничтожения важен - можно перекрыть деструктор.
...
Рейтинг: 0 / 0
08.07.2012, 22:17
    #37870864
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
Только я бы еще сделал так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
  IMyStack = interface
    function Add(AObject: TObject) :TObject;
  end;

procedure Some;
var
  F :IMyStack
  x,y :TExampleObject;
begin
  F := TMyStack.Create;

  x := F.Add(TExampleObject.Create);
  y := F.Add(TExampleObject.Create);
  //...

end; 
...
Рейтинг: 0 / 0
09.07.2012, 01:56
    #37871038
debose
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
В JCL ( JclSysUtils.pas (см. секцию Guards) есть попытка реализовать автоосвобождение объектов. В виде таких методов:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function Guard(Mem: Pointer; out SafeGuard: ISafeGuard): Pointer; overload;
function Guard(Obj: TObject; out SafeGuard: ISafeGuard): TObject; overload;

function Guard(Mem: Pointer; var SafeGuard: IMultiSafeGuard): Pointer; overload;
function Guard(Obj: TObject; var SafeGuard: IMultiSafeGuard): TObject; overload;

function GuardGetMem(Size: Cardinal; out SafeGuard: ISafeGuard): Pointer;
function GuardAllocMem(Size: Cardinal; out SafeGuard: ISafeGuard): Pointer;



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.
  ISafeGuard = interface
    function ReleaseItem: Pointer;
    function GetItem: Pointer;
    procedure FreeItem;
    property Item: Pointer read GetItem;
  end;

  IMultiSafeGuard = interface (IInterface)
    function AddItem(Item: Pointer): Pointer;
    procedure FreeItem(Index: Integer);
    function GetCount: Integer;
    function GetItem(Index: Integer): Pointer;
    function ReleaseItem(Index: Integer): Pointer;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: Pointer read GetItem;
  end;

...
Рейтинг: 0 / 0
09.07.2012, 10:12
    #37871191
Иванов Александр Александрович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
buddenИванов Александр Александрович,
> А почему х там будет уничтожен?
То, что Вы посмотрели исходник, где всё написано, и не поняли, как раз и означает, что с Вас вполне уместно
> брать деньги за стажировку у нас
;)
> Посмотрел код, деструкторы в цепочку вызываются, а что будет если в среднем деструкторе ексепшен высыпится?
Вы правы в том, что поведение в этом случае отличается от try..finally.

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

Хотя тут действительно есть о чём подумать...
Твой говнокод c помощью блокнота разобрать практически невозможно. Это короче не важно, важно другое. П моемому мнению, применять нестандартные решения в стандартных ситуациях, к добру не приведет. Да и зачем использовать подсчет ссылок на интерфейсы когда куда более естественным решением является try finally. Добавлять неясности в коде, ради того, чтобы уйти от одной вложенности - к надежности не приведет. Есть же правило, что достижение качества кода идет через снижение сложности. Мне куда понятней try finaly, нежели ковыряние в каком-то модуле на дредмет того, что делает OnStack.
А вто тут:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure testStackFrame;
var x:TExampleObject; fr:stackFr;
begin
fr:=mkStackFr;
x:=TExampleObject.Create;
onStack(x);
x.example;
end


mkStackFr - глобальная переменная? Тогда если например три подобных процедуры будут вызваны, освобождение первых двух будет когда только третья закончится? Или еще какие-то подводные камни я не учел?
...
Рейтинг: 0 / 0
09.07.2012, 10:21
    #37871200
Иванов Александр Александрович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
А, понял, mkStackFr оказывается функция. Последний вопрос снимается с повестки, но вопрос про стиль еще больше возникает. Смешались люди, интерфейсы, ООП, процедурное программирование...=)
...
Рейтинг: 0 / 0
09.07.2012, 10:24
    #37871207
roschinspb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
А я думаю, что в Delphi механизм уборки мусора появится в "базе", в скором времени, так что не надо бежать впереди паровоза.
...
Рейтинг: 0 / 0
09.07.2012, 10:33
    #37871219
Иванов Александр Александрович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
[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.
procedure testStackFrame;
var x,y:TExampleObject; fr:stackFr;
begin
fr:=mkStackFr;
x:=TExampleObject.Create; onStack(x);
y:=TExampleObject.Create; onStack(y); 
x.example;
y.example; 
end // здесь будет уничтожен сначала y, а потом - x.
[/quot]
Кстати, про один раз(если ексепшен в деструкторе не страшен вам):
[SRC delphi]
A := nil;
B := nil;
C := nil;
try
  A := TObject.Create;
  B := TObject.Create;
  C := TObject.Create;
  a.example;
  ...
finally
   А.Free;
   B.Free;
   C.Free;
end
...
Рейтинг: 0 / 0
09.07.2012, 10:35
    #37871221
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
Херней занимаетесь.
...
Рейтинг: 0 / 0
09.07.2012, 11:36
    #37871343
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
чччДХерней занимаетесь.
Вынужден с прискорбием согласиться )))
Надо руками - finally.
Надо автоматом - interface.
Надо потрахаться на пустом месте - ну выдумывайте чё хотите, только покуда нет внятного результата и бонуса - лучше не публиковаться.
...
Рейтинг: 0 / 0
09.07.2012, 11:43
    #37871356
Barmaley57
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
делфинист предлагает сборку мусора
чччДХерней занимаетесь.+мульён
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / делфинист предлагает сборку мусора / 25 сообщений из 78, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]