Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
ВнизПередача данных в функцию Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.071 c