Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.30;
Скачать: CL | DM;

Вниз

Ф-ции, классы,...   Найти похожие ветки 

 
Juster~   (2003-06-10 22:22) [0]

У меня опять возникли вопросы:
1) Когда в ф-цию передаешь аргумент, то он передается в виде указателя или где-то куда-то будет копироваться блок памяти? Просто я в одну функцию передаю массивный такой обьект и не хотелось бы задержки лишние получать...
2) Насколько быстро происходит обращение к св-вам и методам класса?
Например, Abc.Owner.Parent.Parent.Proc(...) насколько медленнее чем просто Proc(...)?
3) Насколько быстро происходит приведение типов? Например: TAbc(AbcObj)?
p.s. Во всех вопросах наиболее важно максимальное быстродействие
СПАСИБО...


 
Всеволод Соловьёв ©   (2003-06-10 22:46) [1]

procedure pr(xx: integer; var yy: integer);
хх - копируется, если вы будете с ним работать, значение первоначальное по выходу из процедуры останется неизменным. при var передается ссылка, и вы работаете с первоначальным аргументом. При выходе из процедуры останется измененным.
Чего-то сумбурно написал :)


 
Juster~   (2003-06-10 22:49) [2]

Все понятно, спасибо. А если const, тогда тоже копирование в памяти будет?


 
Всеволод Соловьёв ©   (2003-06-10 22:58) [3]

А если const, тогда нет. Но ты не можешь изменять ее в процедуре.


 
evvcom ©   (2003-06-11 01:17) [4]


> procedure pr(xx: integer; var yy: integer);
> хх - копируется

xx - не копируется, а передается через регистры или стек. Но с integer в данном случае пример не удачен. Насколько я понял, автора вопроса больше интересует, что происходит с массивами.
Если параметр передается через var, то всегда передается ссылка и не происходит никаких лишних копирований. Естественно переменную можно изменять и т.д. со всеми вытекающими последствиями.
Если параметр передается через const, то компилятор ведет себя немного по разному в зависимости от длины данных. Если суммарная длина не превышает 4 байт, то передается значение (даже если это массив из 2-4 байт). Если длина больше 4 байт, то данные передаются по ссылке. Никаких копирований не происходит. В переменную (т.е. массив или запись) напрямую писать нельзя, но введя дополнительную переменную, через операции адресации и разадресации можно извратиться и записать в этот массив все, что угодно.
Если параметр передается без var и const длиной опять же более 4 байт, то передается опять ссылка, но в процедуре во время инициализации (самый первый begin) выделяется в стеке память и делается копия исходных данных. Вся дальнейшая работа происходит с этой локальной копией данных, которая уничтожается при выходе из процедуры.


 
Fantasist.   (2003-06-11 02:14) [5]


> массивный такой обьект


Речь не о массиве. Объекты в Delphi - это всегда указатели.


> 3) Насколько быстро происходит приведение типов? Например:
> TAbc(AbcObj)?


Такое приведение времени в run-time не занимает вообще. Это не операция, а просто синтаксическая конструкция.


 
Juster~   (2003-06-11 08:09) [6]

Спасибо

>Такое приведение времени в run-time не занимает вообще
А какое занимает?


 
KSergey ©   (2003-06-11 08:14) [7]

> Juster~ (11.06.03 08:09)

AbcObj as TAbc

Но у него и смысл другой


 
Юрий Зотов ©   (2003-06-11 09:08) [8]

> evvcom © (11.06.03 01:17)

>> procedure pr(xx: integer; var yy: integer);
>> хх - копируется

> xx - не копируется, а передается через регистры или стек.

То есть, все таки копируется. Потому что через регистр или стек можно передать либо адрес расположенной в памяти переменной, либо ее КОПИЮ (что и будет в данном случае). Но вот ее саму нельзя передать никак. Как только Вы скажете что-то типа move или push - так Вы УЖЕ создали КОПИЮ переменной. Именно эта копия и будет передана.


 
k-man ©   (2003-06-11 09:23) [9]

Размусолили маненький вопрос:
1)Если аргумент передается по значению то происходит его копирование и работа идет уже с этим откопированным свойством.
Значение самого аргумента не изменится.
2)Если аргумент передается по сылке то(насколько знаю)
в функцию передается не он а указатель на него.
Соотвественно может изменится и его значение.



Страницы: 1 вся ветка

Текущий архив: 2003.06.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
14-97807
GROL
2003-06-10 23:29
2003.06.30
Windows CE


14-97821
Knight
2003-06-11 22:11
2003.06.30
Есть тут те кто ещё помнит Diablo первой версии?


1-97601
denis24
2003-06-19 09:52
2003.06.30
процедура STR()


1-97587
Muskat
2003-06-11 14:40
2003.06.30
PChar2


7-97898
Intell
2003-04-20 20:25
2003.06.30
Как создать ярлык для своего приложения?