Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.045 c
15-1250852265
partizan
2009-08-21 14:57
2009.10.25
Прочитать документ word


15-1251144306
DillerXX
2009-08-25 00:05
2009.10.25
Как переводится Nightwish?


2-1251446645
TarenoKostanay
2009-08-28 12:04
2009.10.25
Дескриптор окна


15-1251469925
Suspended
2009-08-28 18:32
2009.10.25
Про мошенничество


2-1251642682
tonich
2009-08-30 18:31
2009.10.25
Блокировка потоков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский