Форум: "Потрепаться";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
ВнизФ-ции, классы,... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c