![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Гость_Traum |
|
|||
Unregistered |
Возможные варианты:
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 |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
память выделяется только на заданное значение, т.е. память выделяется, но экономно
|
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
А какие проблемы если передаётся тип real?
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
poor_yorik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 12.1.2005 Где: Общаги г. Киева Репутация: нет Всего: 8 |
В варианте 4 насколько мне известно память не выделяется, и не копируется. Потому-что при изменении внешнего параметра изменяется и внутренний.
Например.
В єтом случае на єкран выводится 'Haha'. А если бы стояло просто procedure dost(s:string), то на экране б мы увидели 'HeHe'. --------------------
Семь раз отмерь, один раз - откомпиль.... Семь раз отпей, один раз - отлей... Семь раз отъешь, один раз - не жадничай и другим дай... |
|||
|
||||
December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
poor_yorik
По-моему, всё наоборот. И разве компилятор позволяет присвоение параметру-константе? |
|||
|
||||
Guest |
|
|||
Unregistered |
real в контексте вопроса не имел смысла - (в реалии может быть кошмарно большой массив какого нибудь типа и вообще не real - в примере случайно указал real). Правильно сформулированный вопрос: Работает ли вариант 4. (параметр с const) по схеме варианта 1. (копирование и выделения) или по схеме варианта 2. (через указатель) ? (важным может оказаться быстродействие или память и хотелось бы со знанием выбирать между просто параметром и параметром в качестве const) |
|||
|
||||
Guest |
|
|||
Unregistered |
poor_yorik
если это работает то тогда ... вопрос ясен. Может кто-нибудь это знает из "официоальных" источников (справка, книга) |
|||
|
||||
Гость_Traum |
|
|||
Unregistered |
poor_yorik
Ниже следующий код привел к противоположному выводу (копирование и выделение имеет место)
В результате на панеле появились 10 и 15. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Если мне не сильно изменяет память, то:
const аналогичен var, только компилятор не позволяет изменить параметр (но если узнать через @ адрес операнда и изменить его, то он изменится и в вызываеющей функции, что говорит о том, что const - тот же var). Если const-параметр имеет длину <= 4 байт, то он передаётся не ссылкой, а значением (в целях быстродействия, всё равно в регистр умещается полностью)... -------------------- С уважением, г-н Посол. |
|||
|
||||
Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Абсолюьно точно. Это так называемый "защищенный указатель", если я ничего не путаю. -------------------- |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Есть люди
![]() Кому надо - тот найдет эту разницу (при передаче определенных типов данных) ![]() -------------------- С уважением, г-н Посол. |
|||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 2 Всего: 74 |
странно, передавать константу. Память должна быть изначально выделена тогда?
-------------------- Всем добра ![]() |
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
p0s0l мог бы сразу написать что енто я не согласен
![]() 1. При Const передается: a) Значение(в регистре) - зависит от размера и типа; б) Указатель на данные(будут ли скопированны при ентом данные, в новое место, зависит от типа - например при Real, Extended будет копирование) - Зависит от типа в) указатель на указатель данных, например TCaption, const(костанты) и т.п. - Зависит от типа. 2. При var передается указатель(что енто будет регистр или ячейка памяти - по большому счету не важно) на указатель данных - ни от чего не зависит. PS: Т.е. будет ли выделение памяти при первом варианте - зависит от типа. Будет ли аналогичени var - зависит от типа. Будет ли перадано значение - зависит от размера и типа. PS2: Зная как работает компилятор можно легко нарушить 1a,1б и "превратить" const в var. PS3: Надеюсь... теперь понятно разъяснил с чем я не согласен ![]() Это сообщение отредактировал(а) Girder - 4.7.2005, 20:44 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Честно, про real, extended - не знал (в принципе, если немного подумать, то это логично, что они передаются значением, в целях быстродействия - получается const реализован так, чтобы добиться максимальной производительности)...
![]() thnx за поправку -------------------- С уважением, г-н Посол. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |