powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
25 сообщений из 226, страница 2 из 10
Улучшил FreeAndNil. Можете не благодарить.
    #39950586
alekcvp,

2 презерватива лучше, чем 1
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950596
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
2 презерватива лучше, чем 1

Не лучше, а безопаснее.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950627
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
ВсеРазумный
2 презерватива лучше, чем 1

Не лучше, а безопаснее.
Теоретики...
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950629
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А в чём он кривой?
Содомия с промежуточной ссылкой и приведением типов через указатели.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950641
rgreat,

Вообще - то никаких приведений нет, к типам. В asm будут только адреса. А приведения нужны, что бы по offset определённого класса, обращаться к нужным элементам в памяти
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950645
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Вообще - то никаких приведений нет <..> а приведения нужны, что бы
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950652
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Содомия с промежуточной ссылкой и приведением типов через указатели.

А в промежкточной ссылке - большой смысл. Просто ты его еще не постиг.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950655
rgreat,

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

В главном сообщение

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure FreeAndNil(const [ref] Obj: TObject);
var
  vTmp: TObject;
begin
  if Obj <> nil then
  begin
    vTmp := Obj;
    TObject(Addr(Obj)^) := nil;
    vTmp.Destroy;
  end;
end;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Project1.dpr.12: begin
0041BD90 55               push ebp
0041BD91 8BEC             mov ebp,esp
Project1.dpr.13: if Obj <> nil then
0041BD93 833800           cmp dword ptr [eax],$00
0041BD96 740F             jz $0041bda7
Project1.dpr.15: vTmp := Obj;
0041BD98 8B10             mov edx,[eax]
Project1.dpr.16: TObject(Addr(Obj)^) := nil;
0041BD9A 33C9             xor ecx,ecx
0041BD9C 8908             mov [eax],ecx
Project1.dpr.17: vTmp.Destroy;
0041BD9E 8BC2             mov eax,edx
0041BDA0 B201             mov dl,$01
0041BDA2 8B08             mov ecx,[eax]
0041BDA4 FF51FC           call dword ptr [ecx-$04]
Project1.dpr.19: end;
0041BDA7 5D               pop ebp
0041BDA8 C3               ret 
0041BDA9 8D4000           lea eax,[eax+$00]





AtomicExchange

Код: pascal
1.
2.
3.
4.
procedure FreeAndNil(var Obj);
begin
  TObject(AtomicExchange(Pointer(Obj), nil)).Free;
end;


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Project1.dpr.10: begin
0041BD90 55               push ebp
0041BD91 8BEC             mov ebp,esp
Project1.dpr.11: TObject(AtomicExchange(Pointer(Obj), nil)).Free;
0041BD93 33D2             xor edx,edx
0041BD95 F08710           lock xchg [eax],edx
0041BD98 8BC2             mov eax,edx
0041BD9A E88198FEFF       call TObject.Free
Project1.dpr.12: end;
0041BD9F 5D               pop ebp
0041BDA0 C3               ret 
0041BDA1 8D4000           lea eax,[eax+$00]




Тут то мы и видим заветное приведение TObject.Free


Точно так же, как и в оригинальной функции
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure FreeAndNil(var Obj);
{$IF not Defined(AUTOREFCOUNT)}
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
{$ELSE}
begin
  TObject(Obj) := nil;
end;
{$ENDIF}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Project1.dpr.17: begin
0041BD90 55               push ebp
0041BD91 8BEC             mov ebp,esp
Project1.dpr.18: Temp := TObject(Obj);
0041BD93 8B10             mov edx,[eax]
Project1.dpr.19: Pointer(Obj) := nil;
0041BD95 33C9             xor ecx,ecx
0041BD97 8908             mov [eax],ecx
Project1.dpr.20: Temp.Free;
0041BD99 8BC2             mov eax,edx
0041BD9B E88098FEFF       call TObject.Free
Project1.dpr.21: end;
0041BDA0 5D               pop ebp
0041BDA1 C3               ret 
0041BDA2 8BC0             mov eax,eax




Подмечаем тот факт, что никаких приведений не было. В любом случае, объект лежит в eax
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950658
Добавлю сами вызовы

Из поста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Project1.dpr.26: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.27: FreeAndNil(t);
0041E5B5 B8DC684200       mov eax,$004268dc
0041E5BA E8D1D7FFFF       call FreeAndNil
0041E5BF 33C0             xor eax,eax




AtomicExchange
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Project1.dpr.19: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.20: FreeAndNil(t);
0041E5B5 B8DC684200       mov eax,$004268dc
0041E5BA E8D1D7FFFF       call FreeAndNil
0041E5BF 33C0             xor eax,eax




Оригинал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Project1.dpr.31: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.32: FreeAndNil(t);
0041E5B5 B8DC684200       mov eax,$004268dc
0041E5BA E8D1D7FFFF       call FreeAndNil
0041E5BF 33C0             xor eax,eax




Вызов идентичный.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950662
inline из поста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Project1.dpr.26: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.27: FreeAndNil(t);
0041E5B5 833DDC68420000   cmp dword ptr [$004268dc],$00
0041E5BC 7414             jz $0041e5d2
0041E5BE A1DC684200       mov eax,[$004268dc]
0041E5C3 33D2             xor edx,edx
0041E5C5 8915DC684200     mov [$004268dc],edx
0041E5CB B201             mov dl,$01
0041E5CD 8B08             mov ecx,[eax]
0041E5CF FF51FC           call dword ptr [ecx-$04]
0041E5D2 33C0             xor eax,eax[code]



inline AtomicExchange
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Project1.dpr.19: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.20: FreeAndNil(t);
0041E5B5 33C0             xor eax,eax
0041E5B7 F08705DC684200   lock xchg [$004268dc],eax
0041E5BE E85D70FEFF       call TObject.Free
0041E5C3 33C0             xor eax,eax



inline org
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Project1.dpr.30: t := TObject.Create;
0041E5A4 B201             mov dl,$01
0041E5A6 A150144000       mov eax,[$00401450]
0041E5AB E84070FEFF       call TObject.Create
0041E5B0 A3DC684200       mov [$004268dc],eax
Project1.dpr.31: FreeAndNil(t);
0041E5B5 A1DC684200       mov eax,[$004268dc]
0041E5BA 33D2             xor edx,edx
0041E5BC 8915DC684200     mov [$004268dc],edx
0041E5C2 E85970FEFF       call TObject.Free
0041E5C7 33C0             xor eax,eax

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950665
Как по мне, мне в любом случае нравится lock xchg от AtomicExchange ибо ручками написать

Код: pascal
1.
2.
    t.Free;
    t := nil;



В реально рабочем коде, он всё равно вставит свою mov eax,ebx

Код: sql
1.
2.
3.
4.
Project1.dpr.31: t.Free;
0041E5F4 8BC3             mov eax,ebx
0041E5F6 E82570FEFF       call TObject.Free
0041E5FB 33C0             xor eax,eax

...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950677
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Rusov,

В рамках функции FreeAndNil - смысл есть. Нет смысла в самой этой функции.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950681
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Ну что же делать если ты такой глупенький. Имелось введу после компиляции.
Да мне как-то пофиг на твою неуёмную тягу к ассемблерному онанизму и разбору выхлопа каких-то конкретных версий компилятора.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950683
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня только сам паскаль интересует.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950708
rgreat,

Удаляй Delphi. Это тебе не паскаль. Это Delphi) Какой смысл использовать язык Delphi))))
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950726
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

https://en.wikipedia.org/w/index.php?title=Delphi_language&redirect=no

Открой и окатись знанием. Языка "Delphi" больше не существует.

На этом все, или еще идиотские комментарии будут?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950730
rgreat,

Ахахах)))) Смешно - смешно. Его не может Не существовать

https://ru.wikipedia.org/wiki/Delphi_(язык_программирования)


Выпуск Delphi 10.3.2 Rio (18 июля 2019)


Ты хоть понимаешь, что сам компилятор Ну ОН СОВЕРШЕННО ничего общего не имеет с паскалевским.


А ты думал так легко деньги зарабатываются ? Взяли компилятор паскаля, добавили пару фич и давай на нём зарабатывать.

Смешной ты типок.


"Этот язык программирования является диалектом языка Object Pascal." Из Вики
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950732
Да, именно что. В Delphi совершенно не имеет ничего общего к компилятору Паскаля.

Схожий только синтаксис.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950734
По твоей логики. Завтра Какой то Вася выпускает диалект языка Паскаля.

А к вечеру все такие - ГОУ Его в рейтинг вместе с Pascal\Delphi\И какашка выполняющая аналог паскаля.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39950749
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Вообще это все не интересно.
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952225
zedxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторEmbarcadero changed the signature of FreeAndNil() in 10.4 Denali:
procedure FreeAndNil(const [ref] Obj: TObject); inline;

https://github.com/IndySockets/Indy/commit/96efd9d4b381ae8531f4756943eb083a41091dcd#diff-fa875d4568a8bcd0f0d1d80726182cdbR1923
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952241
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читают SQL.ru!
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952242
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zedxxx
авторEmbarcadero changed the signature of FreeAndNil() in 10.4 Denali:
procedure FreeAndNil(const [ref] Obj: TObject); inline;

Напомните, а что выделенное дает?
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952253
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
zedxxx
пропущено...

Напомните, а что выделенное дает?
обязательную передачу параметра по ссылке
...
Рейтинг: 0 / 0
Улучшил FreeAndNil. Можете не благодарить.
    #39952254
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Принудительно передает параметр по ссылке, независимо от типа.
...
Рейтинг: 0 / 0
25 сообщений из 226, страница 2 из 10
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшил FreeAndNil. Можете не благодарить.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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