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

Вниз

Передача данных в функцию   Найти похожие ветки 

 
kostyl_kostyl   (2009-09-01 12:28) [0]

Допустим у меня есть функция

function Func(BigObject: TBigObject): Type;

Я передаю в функцию объект большого размера(свойства объекта - большие массивы данных, объектов и т. п.). Затем в функции я использую его свойства.
Вопрос в том на сколько эта операция ресурсоемкая? Я фактически копирую объект или передаю лишь ссылку на него?
А что будет и как отразиться на производительность такие объявления?:

function Func(var BigObject: TBigObject): Type;

function Func(const BigObject: TBigObject): Type;


 
Сергей М. ©   (2009-09-01 12:51) [1]

1. Фактически передаешь указатель.

2. Считай что на производительности var или const никак не отразится.


 
sanx   (2009-09-01 12:55) [2]

Если знаком с асмом, поставь брекпоинт на входе в функцию и когда сработает нажми ctrl +alt+C и поразбирай, это иногда помогает понять работу компилятора.


 
Ega23 ©   (2009-09-01 13:00) [3]


> function Func(var BigObject: TBigObject): Type;
>
> function Func(const BigObject: TBigObject): Type;
>


Через var надо передавать в том случае, если значение указателя изменится. Например:

procedure Test(var Value : TMyObject);
begin
 if not Assigned(Value) then
   Value := TMyObject.Create;
 
 with Value do
   ......
end;

В этом случае, если вызывать процедуру так:

var
 obj : TMyObject;
begin
 obj := nil;
 Test(obj);
end;

то значение obj изменится (был nil, стал - что-то).


 
Сергей М. ©   (2009-09-01 13:03) [4]


> var BigObject: TBigObject


Здесь передается указатель (BigObjectRef) на данные, представляющие собой указатель на объект (BigObject). В теле п/программы ты волен изменять BigObject как тебе вздумается.


> const BigObject: TBigObject


Здесь передается указатель на сам объект (BigObject).
Изменять его (переданный указатель) ты не вправе - компилятор этого не допустит.


> BigObject: TBigObject


Здесь передается копия указателя на сам объект (BigObject).
Ты вправе изменять копию по своему усмотрению, но изменения эти будут в силе до момента завершения п/программы - после ее завершения копия перестает существовать.


 
sanx   (2009-09-01 13:23) [5]

Отличные ответы. Коротко и ясно. А еще лично для меня было интересно обратить внимание на тот факт что Result рождается в вызывающей функции и приходит в вызываему функцию по сути в качесве параметра. То есть для Result выделяется память в вызывающей функции.


 
kostyl_kostyl   (2009-09-01 13:24) [6]

То есть в любом случае передается либо сам указатель на область памяти объекта, либо копия указателя на эту область памяти(защищенная от записи или нет, ну типа), но ни в коем случае не копируются участки самой памяти?


 
Kolan ©   (2009-09-01 13:25) [7]

Да, объект не копируется.


 
Медвежонок Пятачок ©   (2009-09-01 13:25) [8]

function Func(BigObject: TBigObject): Type;
begin
ShowMessage(IntToStr(SizeOf(BigObject)));
end;


 
Сергей М. ©   (2009-09-01 13:28) [9]


> для Result выделяется память в вызывающей функции


Это зависит от типа результата и соглашения о вызове.
В простейшем случае никакая память под передачу результата вообще не выделяется - результат передается через РОН.


> но ни в коем случае не копируются участки самой памяти?


Да.


 
kostyl_kostyl   (2009-09-01 13:45) [10]

Есть еще вопрос:

function Func(): TBigObject;
var
O:TBigObject;
begin
 O := TBigObject.Create;
 O.Var := 5;
 Result := O;
//  Result := TBigObject.Create;
//  Result.Var := 5;
end;

Могут ли быть и какие проблемы с таким кодом в обоих случаях(закоментированном и не закоментированном)?
(я подразумеваю что никаких не будет)


 
Leonid Troyanovsky ©   (2009-09-01 13:49) [11]


> kostyl_kostyl   (01.09.09 13:45) [10]

> (я подразумеваю что никаких не будет)

Для создания больших и маленьких объектов используют
конструкторы, а не обычные (regular) процедуры.

--
Regards, LVT.


 
kostyl_kostyl   (2009-09-01 14:37) [12]

это пример. Сут создать объект и вернуть, не более...


 
Ega23 ©   (2009-09-01 14:38) [13]


> это пример. Сут создать объект и вернуть, не более...


Зачем? Есть же конструктор.


 
kostyl_kostyl   (2009-09-01 14:57) [14]


> Зачем? Есть же конструктор.

Чтобы скрыть создание, зачем? Не надо трогать другие темы.


 
Leonid Troyanovsky ©   (2009-09-01 15:22) [15]


> kostyl_kostyl   (01.09.09 14:57) [14]

> Чтобы скрыть создание, зачем

Собс-ручно изготовленные грабли.

--
Regards, LVT.


 
kostyl_kostyl   (2009-09-01 15:26) [16]


> Собс-ручно изготовленные грабли.

может и да, это вопрос для другой темы.


 
Leonid Troyanovsky ©   (2009-09-01 15:31) [17]


> kostyl_kostyl   (01.09.09 15:26) [16]

> может и да, это вопрос для другой темы.

Ну, дык и задал бы в другой.
Спрашивал про проблемы - ответили без утайки.

--
Regards, LVT.


 
kostyl_kostyl   (2009-09-01 15:50) [18]

меня смущает просто создание объекта в локальной области


 
Медвежонок Пятачок ©   (2009-09-01 15:53) [19]

нет никаких локальных областей.
есть куча, в которой объект и создается.


 
Ega23 ©   (2009-09-01 15:54) [20]


> меня смущает просто создание объекта в локальной области


Какая разница, это не С++ с автоматическим деструктором и не Java со сборкой мусора.


 
kostyl_kostyl   (2009-09-01 16:21) [21]


> Какая разница, это не С++ с автоматическим деструктором
> и не Java со сборкой мусора.

Понятно, спасибо.
(зы: надо было дописать что то типа "Это Delphi с .....";) )


 
Ega23 ©   (2009-09-01 16:23) [22]


> надо было дописать что то типа "Это Delphi с ....."


Да не надо ничего дописывать. "Нагадил - убери за собой". Если перефразировать - Занял память - освободи её, за тебя это никто делать не будет.



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

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

Наверх




Память: 0.52 MB
Время: 0.023 c
2-1251091205
belmol
2009-08-24 09:20
2009.10.25
directx


15-1250886604
Юрий
2009-08-22 00:30
2009.10.25
С днем рождения ! 22 августа 2009 суббота


6-1208844661
berlio
2008-04-22 10:11
2009.10.25
IdSNTP от Indy10 не хочет работать через прокси


2-1251749645
Alexey
2009-09-01 00:14
2009.10.25
Имя файла в TImage


15-1250850838
Медвежонок Пятачок
2009-08-21 14:33
2009.10.25
перечень нехорошего