Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача данных в функцию [D7, XP]


Страницы:   1 2

kostyl_kostyl ©   (2009-09-01 12:28:00) 

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

function Func(BigObject: TBigObject): Type;

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

function Func(var BigObject: TBigObject): Type;

function Func(const BigObject: TBigObject): Type;


Ega23   (2009-09-01 16:23:00) [1]


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


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


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


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

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


Ega23   (2009-09-01 15:54:00) [3]


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


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


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

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


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

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


Leonid Troyanovsky   (2009-09-01 15:31:00) [6]


> kostyl_kostyl   (01.09.09 15:26) [16]

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

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

--
Regards, LVT.


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


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

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


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


> kostyl_kostyl   (01.09.09 14:57) [14]

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

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

--
Regards, LVT.


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


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

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


Ega23   (2009-09-01 14:38:00) [10]


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


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


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

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


Leonid Troyanovsky   (2009-09-01 13:49:00) [12]


> kostyl_kostyl   (01.09.09 13:45) [10]

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

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

--
Regards, LVT.


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

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

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

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


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


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


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


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


Да.


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

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


Kolan   (2009-09-01 13:25:00) [16]

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


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

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


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

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


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


> var BigObject: TBigObject


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


> const BigObject: TBigObject


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


> BigObject: TBigObject


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


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


> 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, стал - что-то).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо