![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача данных в функцию [D7, XP]
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, стал - что-то).