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

Вниз

Передача параметров   Найти похожие ветки 

 
Empleado ©   (2003-08-20 20:33) [0]

В процессе обсуждения текущих задач возникли вопросы, сорри, если уже задавались подобные.

Имеем следующие простенькие объявления:

a) procedure Proc(A: Tsometype);
b) procedure Proc(var A: Tsometype);
c) procedure Proc(const A: Tsometype);
d) procedure Proc(out A: Tsometype);

1) В каком варианте параметры будут быстрее передаваться?
2) Почему?
3) Как это зависит от типа параметра, если зависит вообще? (не разница между типами при передаче - рассматривается один и тот же тип)
4) С какой конструкцией выгоднее (по скорости) работать?

Gracias


 
Skier ©   (2003-08-20 20:38) [1]

out имеет смысл только для интерфесов иначе выгоды от него нет


> В каком варианте параметры будут быстрее передаваться?

в d) если A интерфейс, если нет то в a)

> 2) Почему?

Потому что передаётся указатель на фактический параметр. т.е.
осуществляется передача по ссылке, а не по значению

> С какой конструкцией выгоднее (по скорости) работать?

it depends... :)


 
MBo ©   (2003-08-20 20:38) [2]

В общем-то, хелп и книги надо читать.
Скорость одинаковая, только в первом случае будет создаваться копия параметра.


 
Skier ©   (2003-08-20 20:43) [3]

oops ! перепутал b) и a)
все для a) относить к b)


 
Anatoly Podgoretsky ©   (2003-08-20 21:01) [4]

b, c, d одинаково, а зависит от того какой а, может быть и быстрее и медленнее.

3. смотри выше выше про а
4. тут выгода не применима, тут важно назначение


 
Empleado ©   (2003-08-21 14:38) [5]

Спасибо,
а разговор-то зашел с увиденного мной примера procedure Proc(const A:TLabel) и как комментарий говорилось, что используя const переменные передаются быстрее. Может я что-то не понимаю, что хотел сказать этим автор?

Тогда еще три вопроса, с вашего позволения

1)
>Skier © (20.08.03 20:38) [1]
>out имеет смысл только для интерфесов иначе выгоды от него нет
Действительно, читал в одной книге, чуть ли не дословно повторение выше сказанного. Почему?

2) from Help: An out parameter, like a variable parameter, is passed by reference. With an out parameter, however, the initial value of the referenced variable is discarded by the routine it is passed to. ...
Example: procedure GetInfo(out Info: SomeRecordType);
var MyRecord: SomeRecordType;
GetInfo(MyRecord);
... The call to GetInfo immediately frees the memory used by MyRecord, before program control passes to the procedure. ...

T.e. получается, что процедура создает копию переменной (с тем же значением), т.е. фактически все-таки передает ее значение, затем освобождает память, занятую MyRecord,
и на выходе заносит в нее новое значение. Так?

3) Почему при работе со строками и структурированными типами переменные выгоднее передавать как const?

Gracias


 
Skier ©   (2003-08-21 15:11) [6]

1)
Я тоже об этом прочёл и запомнил, поверив автору на слово :)
Почему это так я подробно не интересовался
2)

> T.e. получается, что процедура создает копию переменной
> (с тем же значением), т.е.

Смысл в том что переданный указатель
просто игнорируется внутри процедуры, т.к. Info используется
только как "хранилище" данным вне процедуры
3) const позволяет компилятору создать более оптимальный код


 
KSergey ©   (2003-08-21 15:38) [7]

MBo © (20.08.03 20:38)
В общем-то, хелп и книги надо читать.
Скорость одинаковая, только в первом случае будет создаваться копия параметра.


Как же одинаковая? На копирование - время надо, мало или много- другой вопрос, но надо. Или я что-то недопонимаю?
А при const тоже только адрес передается. Просто компилятор не дает постоить (явно) код, модифицирующий параметр.


 
KSergey ©   (2003-08-21 15:42) [8]

Да, вот еще: все сравнения выше в основном верны только для передачи не массивов (простых типов, record) (потому и слова "зависит от того, что"). Там все немного по-своему (если не ошибаюсь - всегда передается ссылка на начало массива, хоть что пиши).
А вообще-то ну есть же книжки. Там уж это-то разбирается подробно.



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

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

Наверх




Память: 0.49 MB
Время: 0.016 c
14-10921
Pitay
2003-08-17 20:25
2003.09.04
Ну скажите мне пожалуйста!!! что я делаю не так?


3-10545
Kati
2003-08-12 10:13
2003.09.04
обновление SQL запроса


1-10697
Фомин
2003-08-20 21:32
2003.09.04
Работа с реестром


14-10979
DelphiM
2003-08-15 06:24
2003.09.04
ASPack


1-10759
Юлия
2003-08-24 18:38
2003.09.04
Как из строки убрать ненужные пробелы в начале и в конце строки?