Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 680

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Заводится ли память отдельная память под переменные в процедурах c var.
например:

procedure alg(var pict:TBitMap);
begin
...
end;

заводится ли отдельная память под pict при выполнение процедуры или используется та переменная, которая была при вызове процедуры, т.ё. pictBL:
...
alg(pictBL);
..

SKoch92 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SKoch92 (статус: Посетитель)
Вопрос отправлен: 24 апреля 2009, 20:24
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 25 апреля 2009, 00:03; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 24 апреля 2009, 20:39 [#1]:

Нет, не заводится. Это ж передача по ссылке (указателю).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SKoch92

SKoch92 (статус: Посетитель), 24 апреля 2009, 21:19 [#2]:

Спасибо.
Паровоз

Паровоз (статус: 10-ый класс), 24 апреля 2009, 23:48 [#3]:

Если у Вас три var переменные, то по умолчанию они передаются процедуре в регистах процессора. Если больше, то под эти указатели отводится память в стеке. По завершению работы процедуры эта память возвращается обратно.
Вадим К

Вадим К (статус: Академик), 25 апреля 2009, 00:03 [#4]:

Вот только есть одна маленькая особенность. pict в данном случае указатель (просто он скрытый) и имеет размер 4 байта. Если написать без var, то саму картинку можно менять, более того, даже если написать const, то тоже можно поменять картинку.
В случае var и const расход памяти обычно минимальный - 0 байт на объект. Ну и 4 байта, что бы передать указатель, хотя компилятор может и их сэкономить.
Если без var/const, то может быть 4 лишних байта.
Какой же тогда смысл этих модификаторов? в данном случае - очень тонкий. Если в процедуре вызвать деструктор - объект будет удален во всех трех случаях. Но если сразу за вызовом деструктора добавить pict := null;, то с var по выходу с процедуры мы узнаем об этом (переменная будет тоже null), без var - получим проблему - указатель за пределами процедуры будет указывать в пустоту. если const - то компилятор даст нам по пальцам за такое. Но вот удалить объект всё равно можно...
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 20 февраля 2020, 10:13
Выполнено за 0.02 сек.
Рейтинг@Mail.ru