Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2011, 14:43   #1
Different
Пользователь
 
Регистрация: 11.03.2011
Сообщений: 16
По умолчанию Pointer

Здравствуйте.

Мне необходимо передать компонент процедуре.
Я вычитал, что Delphi работает не с самими компонентами, а с их указателями.

Вот и интересуюсь, какой из вариантов будет быстрее работать:

Код:
procedure proc(btn: Tbutton);
begin
btn.caption := 'asdasd';
end;
или же

Код:
procedure proc(btn: Pointer);
begin
TButton(btn^).caption := 'asdasd';
end;

Последний раз редактировалось Different; 11.03.2011 в 14:49.
Different вне форума Ответить с цитированием
Старый 11.03.2011, 15:18   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

по сути одно и тоже написано.

так что используйте первый вариант.
ибо передаеться ссылка на объект, а не сам объект.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2011, 15:38   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Я вычитал, что Delphi работает не с самими компонентами, а с их указателями.
Это не только с компонентами, но и со всеми объектами.

Цитата:
какой из вариантов будет быстрее работать
Вариант 2 дольше. Ибо перед вызовом нужно получить указатель на объект, а в самой процедуре разименовать указатель.

Вот, для осмысления:
Код:
  proc1 (Button2);
  proc2 (@Button2);
  proc3 (Pointer (Button2));
То же на асме:
Код:
Unit1.pas.44: proc1 (Button2);
mov eax,[ebx+$000002fc]
call proc1

Unit1.pas.45: proc2 (@Button2);
lea eax,[ebx+$000002fc] // на сколько я понимаю, это дольше чем mov
call proc2

Unit1.pas.46: proc3 (Pointer (Button2));
mov eax,[ebx+$000002fc]
call proc3
------------------------------------------------------------------------
Код:
procedure proc1(btn: Tbutton);
begin
  btn.caption := 'asdasd';
end;
Код:
Unit1.pas.27: btn.caption := 'asdasd';
mov edx,$0044d964
call TControl.SetText
------------------------------------------------------------------------
Код:
procedure proc2(btn: Pointer);
begin
  TButton(btn^).caption := 'asdasd';
end;
Код:
Unit1.pas.32: TButton(btn^).caption := 'asdasd';
mov edx,$0044d984
mov eax,[eax] // дополнительная операция
call TControl.SetText
------------------------------------------------------------------------
Код:
procedure proc3(btn: Pointer);
begin
  TButton(btn).caption := 'asdasd';
end;
Код:
Unit1.pas.37: TButton(btn).caption := 'asdasd';
mov edx,$0044d9a0
call TControl.SetText
------------------------------------------------------------------------

Раз экземпляр уже и есть указатель, то и не нужно на него указатель получать.
Sibedir вне форума Ответить с цитированием
Старый 11.03.2011, 16:25   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
lea eax,[ebx+$000002fc] // на сколько я понимаю, это дольше чем mov
неа, это намного быстрее mov, т.к. нет обращения к памяти. Команда lea эквиалентна:

eax := ebx+$000002fc

т.е. простое сложение значения регистра и константы.
Естественно, это выливается потом в:

Код:
mov eax,[eax] // дополнительная операция
т.е. все варианты примерно одинаковы, а второй ещё и позволяет затереть указатель, хранимый в Button2, при желании )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.03.2011, 16:34   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
т.е. все варианты примерно одинаковы, а второй ещё и позволяет затереть указатель, хранимый в Button2, при желании )
а var-параметры для кого?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2011, 16:36   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

для тех, кто пропустил тему про указатели в школе? )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.03.2011, 23:15   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Может, будет интересно: http://www.transl-gunsmoker.ru/2009/09/blog-post.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pointer и String RIO Общие вопросы Delphi 1 18.12.2010 00:38
pointer demonara Помощь студентам 0 22.10.2010 22:23
Pointer Superlotles Помощь студентам 5 12.10.2009 17:24
Указатель. Pointer AHTuKiLLeR Общие вопросы Delphi 6 27.05.2009 13:41
handle <> pointer Altera Общие вопросы Delphi 8 08.10.2008 21:11