Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-97823
Кен
2003-06-10 02:20
2003.06.30
Посоветуйте, пожалуйста, компонент для работы с запароленными


1-97697
mmm
2003-06-17 18:32
2003.06.30
Как переименовать файл?


14-97846
Nik8.
2003-06-12 22:57
2003.06.30
кто знает где здесь ошибка


14-97859
gn
2003-06-11 08:40
2003.06.30
прикольно


7-97910
Some1
2003-04-04 12:56
2003.06.30
Как можно отловить обращение у дисководу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский