| 
| 
 | Вопрос # 2 680/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Заводится ли память отдельная память под переменные в процедурах c var.
 например:
 
 procedure alg(var pict:TBitMap);
 begin
 ...
 end;
 
 заводится ли отдельная память под pict при выполнение процедуры или используется та переменная, которая была при вызове процедуры, т.ё. pictBL:
 ...
 alg(pictBL);
 ..
 
|  |   Вопрос задал: SKoch92 (статус: Посетитель)Вопрос отправлен: 24 апреля 2009, 20:24
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 25 апреля 2009, 00:03; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 24 апреля 2009, 20:39 [#1]:Нет, не заводится. Это ж передача по ссылке (указателю). Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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 - то компилятор даст нам по пальцам за такое. Но вот удалить объект всё равно можно...
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |