powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / делфинист предлагает сборку мусора
78 сообщений из 78, показаны все 4 страниц
делфинист предлагает сборку мусора
    #36017149
Ынтырпрайзз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тыц

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

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

Он не предлагает сборку мусора, он предлагает подобие сишарпового using.
К потере производительности это не ведет.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #37870603
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, про TObjectList я узнал две недели назад, а приложенному коду - два года примерно. Меня отчасти оправдывает то, что я писал ещё на первой версии Delphi, а TObjectList появился не сразу, когда я уже умел без него обходиться.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37870605
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
а кстати, даже, если бы и знал, всё равно написал бы так же.
Во-первых, TObjectList разве гарантирует порядок удаления объектов?
Во-вторых, в моём коде можно поставить брекпойнт или сделать вывод в лог, если
что-то пойдёт не так.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37870644
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenTObjectList разве гарантирует порядок удаления объектов?Да, но это никому не нужно
buddenв моём коде можно поставить брекпойнт или сделать вывод в лог, если
что-то пойдёт не такАналогично с TObjectList

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

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

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

>OnStack не следует автоматически, что она работает со стеком.
Она с ним и не работает, Вы ж исходник читали, как я понял? Кроме того,
слова "на стеке" я недаром заключил в кавычки. Смысл Вашего
высказывания в чём?
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #37870770
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иванов Александр Александрович,
> А почему х там будет уничтожен?
То, что Вы посмотрели исходник, где всё написано, и не поняли, как раз и означает, что с Вас вполне уместно
> брать деньги за стажировку у нас
;)
> Посмотрел код, деструкторы в цепочку вызываются, а что будет если в среднем деструкторе ексепшен высыпится?
Вы правы в том, что поведение в этом случае отличается от try..finally.

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

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

Хотите сборку мусора - используйте интерфейсы. Все
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37870790
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, в целом, я понял, что Вы сегодня ещё ни об кого не вытирали ноги, и именно в этом состоит цель Вашего пребывания в данной теме. Но у Вас плохо получилось, потому что вот этот вопрос
> Попробуйте привести пример когда важен порядок уничтожения объектов
- просто идиотский. Думаю, Вам стоит подумать о смене профессии.
В качестве прикола, предлагаю Вам привести пример того же кода с интерфейсами и мы посмотрим, какой код выглядит страшнее.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37870795
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай, чтобы никто не был сбит с толку кавычками, повторяю: несмотря на то, что объекты не размещаются на стеке, они, тем не менее, уничтожаются при выходе переменной fr из области видимости, в порядке, обратном порядку вызова для них функции onStack и это является достаточно точной аналогией размещения на стеке в С с точки зрения времени жизни объекта. С точки зрения работы с памятью ситуация, конечно, другая, объекты размещаются в куче, как и обычно.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37870818
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenДумаю, Вам стоит подумать о смене профессии. Обязательно подумаю. Спасибо за идею
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #37871200
Иванов Александр Александрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, понял, mkStackFr оказывается функция. Последний вопрос снимается с повестки, но вопрос про стиль еще больше возникает. Смешались люди, интерфейсы, ООП, процедурное программирование...=)
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37871207
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я думаю, что в Delphi механизм уборки мусора появится в "базе", в скором времени, так что не надо бежать впереди паровоза.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #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
делфинист предлагает сборку мусора
    #37871221
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Херней занимаетесь.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37871343
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДХерней занимаетесь.
Вынужден с прискорбием согласиться )))
Надо руками - finally.
Надо автоматом - interface.
Надо потрахаться на пустом месте - ну выдумывайте чё хотите, только покуда нет внятного результата и бонуса - лучше не публиковаться.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37871356
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДХерней занимаетесь.+мульён
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37871360
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. в понедельник с утра этот код не поддается осмыслению ))
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37871363
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873114
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov, от первого варианта по сути не отличается. Однако, у меня есть разные дополнительные вещи, например, bindingVariable (связывает переменную в области видимости fr), finallyDoo( выполнить функцию с аргументом Tobject при закрытии fr).

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

Есть минимальная защита от того, что мы попытаемся написать onStack без создания объекта.

x := F.Add(TExampleObject.Create);
- это вроде не прокатит, придётся писать
x := F.Add(TExampleObject.Create) as TExampleObject;
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873146
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debose, в JCL по сути, то же самое, что и у меня, только у меня применение лаконичнее, поэтому буду и дальше пользоваться своим.

В любом случае, будет хорошо, если народ начнёт пользоваться подобными вещами, в этом случае намного удобнее писать и читать.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873168
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, вообще-то идея разместить объекты на стеке ясно не нова.
Я не пользуюсь дженериками, в моей версии Delphi их попросту нет.
Кроме того, мой код в использовании намного лаконичнее и мне не нужны лишние
типы. Видимо, можно и код по Вашей ссылке сделать настолько же лаконичным.

Но вопрос не в том, есть этот код или нет, а пользуются этим подходом или нет.

Я пользуюсь и нахожу удобным. Если сравнивать Delphi и С++, возможность
совершать действия по факту выхода из функции без написания конструкции
try.., а лишь за счёт создания объекта-сторожа на стеке даёт С++ гигантское
преимущество в выразительности и надёжности. Мне удалось перенести эти
возможности в Delphi, чему я весьма рад.

Если говорить о лиспе, то там вовсю применяются конструкции типа with-open-file,
которые ещё намного мощнее. Без нормального препроцессора их не получится
реализовать в Delphi, но хотя бы не занимать для сторожа имя переменной вполне получается.
Т.е., я могу просто написать

withUpdateTransaction; // и транзакция будет закрыта при выходе из функции

мне не нужно придумывать под это имя переменной.

В моём текущем проекте onStack встречается
362 раза, finallyDo - 20 раз, bindingVariable - 26 раз, разного рода конструкции
with, построенные на том же механизме (кстати, для этого требуется, чтобы была
threadvar для хранения текущего "кадра стека") - примерно 100 раз. Среди
конструкций with есть такие:

withDefaultTransaction
withUpdateTransaction
withMessages
withMutex
withSavedForegroundWindow

Это к ответу на замечание про профит, который кто-то задал.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873181
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenx := F.Add(TExampleObject.Create);
- это вроде не прокатит, придётся писать
x := F.Add(TExampleObject.Create) as TExampleObject;

Прокатит, если объявить:

function Add(AObject: TObject) :Pointer;
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873187
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddendebose, в JCL по сути, то же самое, что и у меня, только у меня применение лаконичнее, поэтому буду и дальше пользоваться своим.

В любом случае, будет хорошо, если народ начнёт пользоваться подобными вещами, в этом случае намного удобнее писать и читать. Вот что-то не заметил ни какого удобства. А изобретать велосипед ради экономии пары строчек, как-то не тянет.
Кроме того, с try finally любому нормальному программеру всё ясно и очевидно, кусок можно скопипастить из одного проекта (примера кода) в другой, а тут въезжай еще что это за методы вызываются где их реализация закопана и т.п.
Т.е. нужны какие-то очень веские основания, которых не заметно.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873189
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenЯ пользуюсь и нахожу удобным. Если сравнивать Delphi и С++, возможность
совершать действия по факту выхода из функции без написания конструкции
try.., а лишь за счёт создания объекта-сторожа на стеке даёт С++ гигантское
преимущество в выразительности и надёжности.
...и огромный проигрыш в производительности.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873241
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusovогромный проигрыш в производительности

кроме доисторического bcc с его унылым кодогеном есть и "более оптимальные" плюсовые компайлеры, к-е умело заинлайнив все что можно минимизируют проигрыш
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873245
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov,
> ...и огромный проигрыш в производительности.
Вы о чём? С++ вообще-то производит весьма быстрый код, а выделение объектов на стеке - быстрее, чем в куче.
Если Вы имеете в виду, что интерфейсы работают намного медленнее try..finally, то я на это Вам так отвечу: популярность Delphi падает, а популярность Python растёт. При этом Python работает примерно в 30-100 раз медленнее Delphi. Я думаю, компромиссные подходы, при которых снижается быстродействие (но всё равно остаётся быстрее Python), при этом сохраняется статическая проверка типов, способствуют продлению жизни Delphi больше, чем верность традиции написания пусть и быстрых, но слишком многословных "правильных" программ.
> Прокатит, если объявить:
> function Add(AObject: TObject) :Pointer;
Это ещё хуже, т.к. отключает статическую проверку типов при создании объекта
varOfSomeClass:=x.Add(TIncompatibleClass.Create);
с непредсказуемыми последствиями.

Кстати, у меня есть один класс nod, который я очень часто использую и для которого есть
специальная версия выделения на стеке:

Код: pascal
1.
function nodOnStack(nd:nod):nod; begin onStack(nd); result:=nd; end;


И мы можем составлять выражения из объектов, размещённых на стеке.

Код: pascal
1.
2.
3.
4.
var fr:stackFr;
begin fr:=mkStackFr;
nodOnStack(nod.create).print;
end; 


т.е., объекты могут быть анонимными. Здесь print - это метод класса nod. Если Вы сделаете
onStack указателем, то нельзя будет вызвать print без явного приведения типа (с отсутствием
статической проверки), а если Вы сделаете как Вы предлагаете x.add, то функция nodOnStack
будет принимать лишний параметр - сам объект-хранитель.

У меня объект-хранитель неявен (определяется текущим тредом), поэтому сама
конструкция onStack имеет один параметр, можно написать функцию nodOnStack
с одним параметром и функцию with... с нулём параметров.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873346
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden> ...и огромный проигрыш в производительности.
Вы о чём? С++ вообще-то производит весьма быстрый код, а выделение объектов на стеке - быстрее, чем в куче.
Я про Ваш подход vs try-finally, а не про C++. Вы выделяете объекты в куче + добавляете дополнительный оверхеад при работе со списками и интерфейсами. На стеке, возможно, и быстрее - но то, что Вы предлагаете это и близко не лежало.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873354
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov, я ответил про Python. Когда питонистов спрашивают "что вы делаете, когда ваша программа тормозит слишком сильно", они говорят "мы переписываем это на С". Соответственно, в нашем случае можно переписать на try..finally. Но даже если этого не делать, будет всё равно на порядок быстрее, чем на питоне.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873392
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenКогда питонистов спрашивают "что вы делаете, когда ваша программа тормозит слишком сильно", они говорят "мы переписываем это на С"
hiphop туда же
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873434
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,
не понял, что Вы имеете в виду, но они переписывают на С не всю программу, а только узкие места по производительности. Я сам не сторонник Python, однако, тот факт, что Delphi тихонько умирает, а Python идёт в гору, я не взялся бы оспаривать.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873436
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соответственно, как человек, не желающий ни в какой перспективе переходить ни на Python, ни на С++, предпочитаю взять из других языков то, что можно, и использовать это в Delphi.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873440
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenне понял, что Вы имеете в виду
почитай про "facebook php c++ hiphop"
а рулит у них александреску, если ты в плюсах ориентируешься тож не пустой звук должен быть
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37873854
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,
нда, была у меня пара лет назад идея сделать компилятор PHP в нативный код. Хм, может ещё не поздно вступить в эту гонку? Ненавижу С++, уделать их было бы весьма приятно.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37874321
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenбыла у меня пара лет назад идея сделать компилятор PHP в нативный код
"все уже украдено до нас" (С)
buddenможет ещё не поздно вступить в эту гонку? Ненавижу С++, уделать их было бы весьма приятноалександреску нервно закурил
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37874331
Иванов Александр Александрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavanbuddenбыла у меня пара лет назад идея сделать компилятор PHP в нативный код
"все уже украдено до нас" (С)
buddenможет ещё не поздно вступить в эту гонку? Ненавижу С++, уделать их было бы весьма приятноалександреску нервно закурил
+1
Вот уделает их, вообще ЧСВ зашкалит, будет деньги не за стажировку брать, а за чтение его мыслей на форуме.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37874662
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden... предпочитаю взять из других языков то, что можно, и использовать это в Delphi. А не пробовали из нескольких блюд взять всё самое вкусное и смешать? С бутерброда икру, из супа кусок мяса, из мартини вишенку, с торта кремовую розочку...
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37876319
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иванов Александр Александрович,

У меня ЧСВ адекватно достижениям. А Вы, милочек - баран (извините). Потому что, вместо того, чтобы попытаться понять код или, допустим, написать консольный проект из 10 строк и запустить его, Вы просмотрели код в блокноте (sic!) и после этого на форуме (на весь интернет!) стали сомневаться в работоспособности кода.

Почему, Вы думаете, я должен был Вам отвечать в теме, где я искал сотрудников? Ведь это было своего рода тестовое задание на собеседовании, и Вы, кстати говоря, его не решили. Более того, Вы его не решили, даже когда Вам дали подсказку в виде работоспособного исходника. Вы думаете, мне больше нечем заняться, кроме как делать Вашу работу?

С Вас нужно только брать деньги и никак иначе - это побудит Вас внимательнее читать исходники и пользоваться для этого адекватными средствами. Хотя... потраченное на Вас время Вы отработали, указав на проблему с исключениями, за что Вам объявляется ещё и благодарность с занесением в исходник.

Чтобы впредь больше никто не смотрел проект в блокноте, а имел возможность его запустить и убедиться в том, что всё работает, прилагается тестовый проект.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37876336
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden,тьфу,ошибся в комментах. Всё переделал.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37876342
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden, и ещё одна правка, пожалуй, не помешает.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37876665
Иванов Александр Александрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenИванов Александр Александрович,

У меня ЧСВ адекватно достижениям. А Вы, милочек - баран (извините). Потому что, вместо того, чтобы попытаться понять код или, допустим, написать консольный проект из 10 строк и запустить его, Вы просмотрели код в блокноте (sic!) и после этого на форуме (на весь интернет!) стали сомневаться в работоспособности кода.

Почему, Вы думаете, я должен был Вам отвечать в теме, где я искал сотрудников? Ведь это было своего рода тестовое задание на собеседовании, и Вы, кстати говоря, его не решили. Более того, Вы его не решили, даже когда Вам дали подсказку в виде работоспособного исходника. Вы думаете, мне больше нечем заняться, кроме как делать Вашу работу?

С Вас нужно только брать деньги и никак иначе - это побудит Вас внимательнее читать исходники и пользоваться для этого адекватными средствами. Хотя... потраченное на Вас время Вы отработали, указав на проблему с исключениями, за что Вам объявляется ещё и благодарность с занесением в исходник.

Чтобы впредь больше никто не смотрел проект в блокноте, а имел возможность его запустить и убедиться в том, что всё работает, прилагается тестовый проект.
На Вы и баран - вместе не совмещаются.
Я спросил как работает, ответ - думайте сами. Еще деньги брать за стажировку. Это все говорит о безкрайнем ЧСВ, и только. Одна фраза - "используются интерфейсы" решила бы проблемы. Но нет, надо строить из своего решения какую-то невероятно полезную вещь(коей она не является) и заставлять копошится в говномодуле. Ну не знаю, я бы перед демонстрацией на весь интернет!! :), если очень хочется чтобы твой код смотрели, хоть модуль в порядок привел бы.
З.Ы. Заставлять придумывать нестандартные решения там, где есть стандартные, на собеседовании - простой способ никого не нанять.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37876679
Иванов Александр Александрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-мне интересно, вы писали что взяли кого-то. Он что, написал подобное решение на собеседовании? Только честно.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37876767
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иванов Александр Александрович,
> если очень хочется чтобы твой код смотрели, хоть модуль в порядок привел бы.
Я занят работой, и данный модуль мне в ней помогает. Меня он устраивает. Деструктор я поменял согласно комменатрию в примере, посмотрим, что будет. А так - я его приведу в порядок, когда перестанет устраивать. Мне умеренно хочется, чтобы Дельфи не умирал, поэтому я опубликовал этот код. Но не настолько, чтобы его менять, ведь я могу его сломать, а модуль ответственный и последствия могут быть серьёзными. "Оно работает? Да - не трогай его". Если хотите, можете в течение недели привести его в то, что Вы считаете порядком и, если мне понравится, я положу на Ваш телефон 500 рублей. Но я буду сильно придираться, учитывая Ваше плохое поведение. Категорически не рекомендуется менять стиль отступов.

> Но нет, надо строить из своего решения какую-то невероятно полезную вещь(коей она не является)
Полезной она являтся. Статистику использования я приводил. Раньше, каждый раз, когда мне надо было писать finally ... freeAndNil(x) ... end я ненавидел Дельфи, т.к. я знал, что в других языках без этого можно обойтись и знал, что нет никакой уважительной причины для отсутствия выделения объектов на стеке. Для разработчиков языка добавить такую поддержку - это раз плюнуть. Теперь я решил этот вопрос и спокойно работаю. Это польза, а Вы опять гоните и хочется ещё как-нибудь нелестно Вас назвать.

Скорее, эта фича не является настолько магической, как могло бы показаться. Ну и что? Полезной она от этого быть не перестаёт.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37876891
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenНо я буду сильно придираться, учитывая Ваше плохое поведение... даже в угол могу поставить
buddenКатегорически не рекомендуется менять стиль отступов.Это особый почерк Вашей конторы? Чтобы все боялись и не могли использовать Ваше "поделие" в своих программах?
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37877292
Esperito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenРаньше, каждый раз, когда мне надо было писать finally ... freeAndNil(x) ... end я ненавидел Дельфи, т.к. я знал, что в других языках без этого можно обойтись и знал, что нет никакой уважительной причины для отсутствия выделения объектов на стеке.Рекомендую срочно переходить на другой язык.
Польза от ваших изысканий на древней версии Делфи, честно говоря, весьма сомнительна...
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37877348
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esperito, что именно я упустил? Так уже можно? Я работаю в Delphi 2007 и не собираюсь ничего менять в обозримом будущем.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37877374
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenEsperito, что именно я упустил? Так уже можно? Я работаю в Delphi 2007 и не собираюсь ничего менять в обозримом будущем.Не поверишь, но придётся!
Новые платформы, новые железки etc заставят.
А с D2007 перейти на D2009+ ой как не просто. А забыть про VCL и влезть в FM... хех
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37877384
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator, у меня достаточно долгий и успешный опыт обороны от прогресса.
Может, и придётся когда-нибудь, но думаю, что не скоро :)
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37877393
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden, уж всем известно, что кирдыка сг не будет, а стагнация кончается регрессом :)
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37877480
Esperito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenEsperito, что именно я упустил? Так уже можно? Я работаю в Delphi 2007 и не собираюсь ничего менять в обозримом будущем.На дженериках реализации scoped objects выглядят изящнее. Пример , реализация . Обрати внимание, Scoped - это record.
Но стоит ли ради этого жертвовать производительностью и натыкаться на грабли?
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37881804
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EsperitoНа дженериках реализации scoped objects выглядят изящнее. Пример , реализация . Обрати внимание, Scoped - это record.
Но стоит ли ради этого жертвовать производительностью и натыкаться на грабли?
Возможно, изящнее, но в моём языке их нет. Производительностью жертвовать ради выразительности стоит почти всегда, а грабель я тут особых не вижу.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37882418
Esperito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дженерики - это ещё и строгий контроль типов.
buddenВозможно, изящнее, но в моём языке их нет.И какой из этого следует вывод?
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37882841
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esperito, вывод? Я данную проблему для себя давно решил без дженериков, т.е. мотива переходить на что-то у меня нет. Мой код - это не "изыскания", как Вы изволили выразится, а рабочий инструмент, который я постоянно использую (статистику применения см. выше в теме). Буду и дальше пользоваться тем, что написал. Абсолютно уверен, что не все спешат перейти на каждую новую версию Delphi или других программ, которые только появляются в природе. Найдутся люди, которым мой код пригодится. Кому не нравится оформление - могут взять идею и сделать своё такое же. Если кому-то не пригодится - что ж, значит не пригодится, на вкус и цвет товарищей нет.

Касаемо дженериков. В Дельфи и без дженериков полиморфизм устроен достаточно хорошо благодаря дизайну и RTTI. Например,
вот функции, которыми я иногда пользуюсь.
Код: pascal
1.
2.
3.
4.
5.
6.
procedure SetPropValue(Instance: TObject; const PropName: string;
  const Value: Variant); overload;// только для published
function setIntPropByName(o:TPersistent;propertyName:string;value:integer):PPropInfo;
function setNotifyEventPropByName(o:TPersistent;propertyName:string;value:TNotifyEvent):PPropInfo;
procedure invokeNotifyEventByName(o:TObject;Name:string;Sender:TObject);
procedure ChangeClass(Obj: TObject; C: TClass);


Эти функции позволяют однородно обращаться к уже существующим классам, которые стали не родственными из-за ограничений наследования в Дельфи. Например, к классам VCL. Да, это медленное обращение, но это - 0.1% всех обращений к объектам, а в Питоне 100% обращений к объектам делаются так, и всё равно на Питоне пишут полезные программы. Может быть, то же самое можно сделать лучше с дженериками, но и без дженериков тоже можно.

Дженериков я наелся, когда пришлось программировать на С++. Я безконечно далёк от того, чтобы ими восхищаться. В С++ они порождают не меньше проблем, чем решают. Возможно, в Дельфи они сделаны менее криво, чем в С++, но этот вопрос для меня не имеет пока даже академического интереса, потому что мне интересен только один вид препроцессора - это defmacro.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37882862
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden,
главное - не забрасывай PHP компилятор. А то, кроме тебя, кто еще их уделаеть сможет?
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37883167
Иванов Александр Александрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenИванов Александр Александрович,
> если очень хочется чтобы твой код смотрели, хоть модуль в порядок привел бы.
Я занят работой, и данный модуль мне в ней помогает. Меня он устраивает. Деструктор я поменял согласно комменатрию в примере, посмотрим, что будет. А так - я его приведу в порядок, когда перестанет устраивать. Мне умеренно хочется, чтобы Дельфи не умирал, поэтому я опубликовал этот код. Но не настолько, чтобы его менять, ведь я могу его сломать, а модуль ответственный и последствия могут быть серьёзными. "Оно работает? Да - не трогай его". Если хотите, можете в течение недели привести его в то, что Вы считаете порядком и, если мне понравится, я положу на Ваш телефон 500 рублей. Но я буду сильно придираться, учитывая Ваше плохое поведение. Категорически не рекомендуется менять стиль отступов.

> Но нет, надо строить из своего решения какую-то невероятно полезную вещь(коей она не является)
Полезной она являтся. Статистику использования я приводил. Раньше, каждый раз, когда мне надо было писать finally ... freeAndNil(x) ... end я ненавидел Дельфи, т.к. я знал, что в других языках без этого можно обойтись и знал, что нет никакой уважительной причины для отсутствия выделения объектов на стеке. Для разработчиков языка добавить такую поддержку - это раз плюнуть. Теперь я решил этот вопрос и спокойно работаю. Это польза, а Вы опять гоните и хочется ещё как-нибудь нелестно Вас назвать.

Скорее, эта фича не является настолько магической, как могло бы показаться. Ну и что? Полезной она от этого быть не перестаёт.
Польза этой фичи только для ленивых. Убрать try finally, который является стандартом, заменив на подсчет ссылок интерфейсов. Это есть использование интерфейсов не по назначению, так сказать сайд-эффект. Не спорю, кому-то покажется полезным, но сам я такое использовать не буду.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37883168
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenВозможно, в Дельфи они сделаны менее криво
такой же bloated ужас, а не криво они в принципе не умеют
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37883179
Иванов Александр Александрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно замечание. OnStack - я так понимаю имеется в виду FILO. Неужели важность этой особенности больше, нежели указание, что будет объект автоматически уничтожен. Плюс OnStack может ввести в заблуждение, на счет стека, как части памяти.
По-моемому, проще функцию назвать типа как в С# - "В сборщик мусора". Так хоть понятней будет.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37883231
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
. Убрать try finally, который может использоваться не только для изничтожения созданных объектов, но и для обеспечения логической целостности.... с другой стороны - костылик для написания простыней? создал объект - добавил - не паришься прописывать его убийство в финализации.... с третьей - добавил его в обжект-лист, и только этот обжект-лист в финализации и сносишь. Со всем содержимым. В общем - не стал бы я в своих проектах в точности такой модуль использовать, но идея - в чем то здравая.... а еще - когда микрообъекты постоянно создаешь - удаляешь - их можно не удалять, а на потом оставлять. в кучке. Не нужен - вернул, нужен - взял. Крохоборская экономия такая.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37884694
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> OnStack - я так понимаю имеется в виду FILO.
Удивительно, конечно, что у народа возникают трудности с элементарными вещами, но FILO, или скорее LIFO - это не просто так,это фундаментальная особенность очень многих явлений жизни.

Деньги в кошельке,кошелёк в кармане. Смерть в игле, игла в яйце, яйцо в утке, и т.п. Компонент принадлежит форме, форма принадлежит приложению. Сначала подключись к серверу, потом открой запрос. Порядок уничтожения определяется порядком вложенности.

Соответственно, размещение именно на стеке это паттерн, к-рый зачастую делает алгоритм ясным.

> Убрать try finally, который является стандартом
Не стоит забывать, что Object Pascal вырос просто из Паскаля, к-рый является учебным языком, не самым удачным. То ли у Вирта не хватило ума, то ли сработали какие-то ограничения (по времени,бюджету, числу страниц стандарта). Выучите лисп, бейсик, bash и С++ для расширения кругозора, тогда станет ясно, что почти во всех языках не хватает каких-то важных концепций и их приходится реализовывать с помощью костылей. Лучше всего, конечно же, выучить лисп, потому что в нём больше всего концепций, незнакомых современным программистам и потому что в нём наиболее мощные способы создания костылей. Хотя потихонечку его и разворовывают, например, лямбда-функции, которые в лиспе были ещё в 80-х годах, (если не в 60-х) наконец-то появились и в С#, и в Дельфи, если мне память не изменяет. Я написал данный код, основываясь на практике работы в лиспе и используя концепции лиспа. Например, bindingVariable - это эмуляция понятия special variable лиспа, до которой дизайнеры "современных" языков, может быть, ещё не додумались, хотя она очень естественна.

Короче говоря, для Вас стандарт - это, может быть, что-то святое, а я отношусь к нему лишь как к инструменту. Слава Богу, я веду свой проект сам и могу позволить себе роскошь устанавливать свои правила кодирования.

> По-моемому, проще функцию назвать типа как в С# - "В сборщик мусора".
Это разные понятия. При сборке мусора момент уничтожения объекта неизвестен. Для типонебезопасных языков, в к-рых легко испортить память и к к-рым относится и Delphi, это слишком опасно. Размещение "на стеке" наиболее безопасно, т.к. момент уничтожения объекта точно определён. Более мощными и более опасными методами (подсчёт ссылок и сборка мусора в собственном смысле слова) в таких языках нужно пользоваться только тогда, когда они действительно необходимы. Ближайший аналог того, что я написал - это именно размещение на стеке, отсюда и название.

> но и для обеспечения логической целостности
Уничтожение объектов тоже может служить логической целостности, на этом основано finallydoo и объекты-стражи (guard). Всё это у меня реализовано, не считая того, что экспешен в "финализаторе" в текущей версии сломает механизм.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37884856
Иванов Александр Александрович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да "размещение на стеке" не имеет отношения к сборке мусора. Такого общепринятого понятия вообще нет. Еще раз, для медленно вникающих: стек отношения к уничтожению объектов не имеет.
Любой вменяемый программист, когда говорит о стеке, он думает о "последнем пришел, первым у ушел", а не об уничтожении объектов. Неужели это не очевидно?

Стандарт - это не святое. Это то ,что выработано практикой и дает понимание, написанного одним программистом, другому программисту. Подход, яля "пишу вне стандартов", или "свой код смотрю только я" - подход истинного говнокодера.

Короче, подход понятен. Сэмулировал что-то встроенное из другого языка возможностями текущего и рад. Только во-первых, это всегда неэффективно, во-вторых заставляет на одном языке думать в терминах другого языка. Много программистов дельфи, которые программируют еще и на лиспе?
"Лучше всего, конечно же, выучить лисп, потому что в нём больше всего концепций, незнакомых современным программистам и потому что в нём наиболее мощные способы создания костылей" - спасибо поржал. Короче , давай, до свиданья!
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37884899
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стек отношения к уничтожению объектов не имеет.
я это понял как метафору того, что "локальные переменные ф-ции" "обычно в компилируемых языках живут на стеке цп". мдя....

если ограничивать "время жизни" пределами ф-ции - да, все хорошо. Если как в плюсах например иметь локальные переменные внутри блоков..... то опять - try - finally ? или это не нужно - внутри блока? например ограничивать время жизни объекта одной итерацией цикла? ну наверное - костыли гибкие, и можно создать еще 1 - локальный хранитель.... и его принудительно.... но прозрачность - теряется, контуры - размываются.

Если хочется как в лиспе, то и писать надо - на лиспе, где все как в лиспе.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37885190
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenСлава Богу, я веду свой проект сам и могу позволить себе роскошь устанавливать свои правила кодирования.Дай Бог, чтобы так оно оставалось до самой смерти проекта. Чтобы не пришлось этот проект поддерживать кому-нибудь другому
buddenБолее мощными и более опасными методами (подсчёт ссылок и сборка мусора в собственном смысле слова) в таких языках нужно пользоваться только тогда, когда они действительно необходимы.О как. Т.е. Вы типом string не пользуетесь? Опасно же. А вдруг, что-то произойдет?
buddenне считая того, что экспешен в "финализаторе" в текущей версии сломает механизм.Первое же многопоточное приложение даже воспоминаний от Вашей системы не оставит
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37885349
Esperito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenЯ данную проблему для себя давно решил без дженериков, т.е. мотива переходить на что-то у меня нет. Мой код - это не "изыскания", как Вы изволили выразится, а рабочий инструмент, который я постоянно использую (статистику применения см. выше в теме). Буду и дальше пользоваться тем, что написал.Вы же вроде бы пришли в эту тему, чтобы узнать, а не появилось ли более удачное решение по автоматическому освобождению памяти.
Появилось. Но на основе более новой версии Делфи, на которую вы переходить не хотите.

buddenВ Дельфи и без дженериков полиморфизм устроен достаточно хорошо благодаря дизайну и RTTI.В D2010 RTTI значительно улучшили.

buddenДженериков я наелся, когда пришлось программировать на С++.Извините, в C++ нет дженериков, там шаблоны.
Это таки большая разница.

P.S. То, что у вас реализовано, - это не сборка мусора. Для полноценной сборки мусора нужен отдельный объект - сборщик мусора, для эффективности он должен быть интегрирован с менеджером памяти, он же должен решать, когда освобождать память (обычно это делается нечасто, но помногу, и вовсе не во время выхода каждый переменной из области видимости).
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37885406
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakovесли ограничивать "время жизни" пределами ф-ции - да, все хорошо. Если как в плюсах например иметь локальные переменные внутри блоков..... то опять - try - finally ?
Да, есть такая неприятность. Два варианта:
1. try-finally и вторая переменная fr2, к-рая на finally явно присваивается unassigned.
2. локальная процедура и в ней локальная переменная fr. например ограничивать время жизни объекта одной итерацией цикла?
Если количество итераций не слишком велико и деструкто объекта просто освобождает память, я не парюсь
и размещаю объекты для всех итераций "на стеке",примерно так:
Код: pascal
1.
2.
3.
4.
5.
for i:=1 to N do
  begin
  x:=TSomeObject.Create(nil); onStack(x); 
  // делать что-то
  end

В итоге будет размещено N объектов и все они будут уничтожены при закрытии fr.
Если же объект является хранителем чего-то и его деструктор нужен не только для освобождения памяти,
но и является частью логики приложения, то остаётся try-finally или оформить тело цикла в виде процедуры.
_Vasilisk_...многопоточное приложение...Не помню, чтобы я это тестировал, но, по замыслу, должно работать. Переменная, содержащая текущий кадр стека - threadvar, не вижу других граблей.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37885420
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EsperitoP.S. То, что у вас реализовано, - это не сборка мусора.
Я разве это утверждал? Перед тем, как я начал тему, мне показалось, что мне нужна для одного дела сборка мусора, но я уже давно без неё обошёлся и даже забыл повод. А всё обсуждение stackutil - это офтоп, вообще-то.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37885436
Esperito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenЯ разве это утверждал?Я просто уточнил, на всякий случай.

Так что, тема исчерпана?
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37885754
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esperito, ну вообще, вопрос, который я поставил в своём первом комменте, по-моему, так и остался без ответа.
Касаемо моего кода, stackutil, видимо, нужно сделать более развёрнутый набор примеров, тестовые проекты, протестировать потокобезопасность, но у меня нет времени этим заниматься и не скоро появится.
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37885880
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, а вроде вот это никто не приводил ещё:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1292
я, правда, пока не понял, как работает. Блин, сколько ж времени ушло зря...
...
Рейтинг: 0 / 0
делфинист предлагает сборку мусора
    #37886105
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем-то, применив code splicing к функциям из модуля system, можно сделать так, чтобы декларирование переменной определённого типа приводило к вызову нужного кода в момент входа и выхода из функции. Т.е., сделать так, чтобы было достаточно писать
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure p(); 
var o:TMyObject;
var fr:stackFr; 
begin  
// fr:=mkStackFr; // это будет уже не нужно
o:=TMyObject.Create; onStack(o); 
o.callSomeMethod;
end; // o автоматически удаляется

Накладные расходы были бы относительно малы - ещё одно ветвление в коде инициализации и деинициализации переменной (их там уже и так штук 5). При этом стали бы не нужны интерфейсы для реализации "размещения на стеке". Но, по правде говоря, писать один раз "fr:=mkStackFr;" меня не настолько обременяет, чтобы возиться с этим и порождать проблемы при переходе к другим версиям Delphi.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
делфинист предлагает сборку мусора
    #39895735
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debose,

Спасибо за ISafeGuard. Заюзал в одном месте, похоже что работает нормально.
...
Рейтинг: 0 / 0
78 сообщений из 78, показаны все 4 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / делфинист предлагает сборку мусора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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