| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Параметры в процедурах и функциях |
| Автор: Гость_Traum 1.7.2005, 15:19 |
| Возможные варианты: 1. procedure (p:real); 2. procedure (var p:real); 3. procedure (out p:real); 4. procedure (const p:real); При этом известно что: 1. - происходит выделение памяти и копирование параметра 2. - нет выделения памяти и нет копирования, а работа через указатель 3. - тоже что и 2. только может быть не инициализирована 4. - невозможность изменения Вопрос: В варианте 4. непонятно происходит ли выделение памяти и икопирование по аналогии с вариантом 1., от которого вариант 4. отличается недопустимостью изменения параметра? |
| Автор: Akella 1.7.2005, 15:36 |
| память выделяется только на заданное значение, т.е. память выделяется, но экономно |
| Автор: Vit 1.7.2005, 15:42 |
| А какие проблемы если передаётся тип real? |
| Автор: poor_yorik 1.7.2005, 16:09 | ||
| В варианте 4 насколько мне известно память не выделяется, и не копируется. Потому-что при изменении внешнего параметра изменяется и внутренний. Например.
В єтом случае на єкран выводится 'Haha'. А если бы стояло просто procedure dost(s:string), то на экране б мы увидели 'HeHe'. |
| Автор: December 1.7.2005, 16:47 |
| poor_yorik По-моему, всё наоборот. И разве компилятор позволяет присвоение параметру-константе? |
| Автор: Guest 1.7.2005, 17:07 | ||
real в контексте вопроса не имел смысла - (в реалии может быть кошмарно большой массив какого нибудь типа и вообще не real - в примере случайно указал real). Правильно сформулированный вопрос: Работает ли вариант 4. (параметр с const) по схеме варианта 1. (копирование и выделения) или по схеме варианта 2. (через указатель) ? (важным может оказаться быстродействие или память и хотелось бы со знанием выбирать между просто параметром и параметром в качестве const) |
| Автор: Guest 1.7.2005, 17:12 |
| poor_yorik если это работает то тогда ... вопрос ясен. Может кто-нибудь это знает из "официоальных" источников (справка, книга) |
| Автор: Гость_Traum 1.7.2005, 18:24 | ||
| poor_yorik Ниже следующий код привел к противоположному выводу (копирование и выделение имеет место)
В результате на панеле появились 10 и 15. |
| Автор: p0s0l 1.7.2005, 18:40 |
| Если мне не сильно изменяет память, то: const аналогичен var, только компилятор не позволяет изменить параметр (но если узнать через @ адрес операнда и изменить его, то он изменится и в вызываеющей функции, что говорит о том, что const - тот же var). Если const-параметр имеет длину <= 4 байт, то он передаётся не ссылкой, а значением (в целях быстродействия, всё равно в регистр умещается полностью)... |
| Автор: Medved 4.7.2005, 00:14 | ||
Абсолюьно точно. Это так называемый "защищенный указатель", если я ничего не путаю. |
| Автор: p0s0l 4.7.2005, 07:27 |
| Есть люди Кому надо - тот найдет эту разницу (при передаче определенных типов данных) |
| Автор: SoWa 4.7.2005, 10:04 |
| странно, передавать константу. Память должна быть изначально выделена тогда? |
| Автор: Girder 4.7.2005, 11:30 |
| p0s0l мог бы сразу написать что енто я не согласен 1. При Const передается: a) Значение(в регистре) - зависит от размера и типа; б) Указатель на данные(будут ли скопированны при ентом данные, в новое место, зависит от типа - например при Real, Extended будет копирование) - Зависит от типа в) указатель на указатель данных, например TCaption, const(костанты) и т.п. - Зависит от типа. 2. При var передается указатель(что енто будет регистр или ячейка памяти - по большому счету не важно) на указатель данных - ни от чего не зависит. PS: Т.е. будет ли выделение памяти при первом варианте - зависит от типа. Будет ли аналогичени var - зависит от типа. Будет ли перадано значение - зависит от размера и типа. PS2: Зная как работает компилятор можно легко нарушить 1a,1б и "превратить" const в var. PS3: Надеюсь... теперь понятно разъяснил с чем я не согласен |
| Автор: p0s0l 4.7.2005, 18:02 | ||||
Честно, про real, extended - не знал (в принципе, если немного подумать, то это логично, что они передаются значением, в целях быстродействия - получается const реализован так, чтобы добиться максимальной производительности)...
thnx за поправку |