![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 2 Всего: 12 |
Скажите какой из вареанто верный.
procedure(var a,b: Integer; c: String); 1. var относится только к a,b 2. var относится к a,b,c Также и с Const если написать procedure(const a,b: Integer; c:String); Будетли Const относится к a,b,c А то я что-то не разобрался??????? |
|||
|
||||
| digs |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 14.10.2006 Репутация: нет Всего: 1 |
и const и var радотают до точки с запятой
|
|||
|
||||
| ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 2 Всего: 12 |
И ещё какая разница меду записями:
Procedure(const A: Integer); Procedure(A: Integer); Т.е. как они будут выглядеть в EXE файле и как будут работать (быстрее) так как я вкниге читал что используя const можно оптимизировать прцедуру. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Если const, то физически в процедуру передаётся не значение A, а указатель на исходную переменную.
То же самое происходит и в случае var, но в var переменную разрешено менять. Соответственно только в случае var исходная переменная изменится. Без var можно менять A, как угодно - на исходную переменную не повлияет. С const вообще нельзя менять A. Никакого ускорения от этого быть не может. С точки зрения скорости, не имеет никакого значения, что именно класть в стек - значение или указатель. Извлекаем мы всё равно всё те же 4 байта. А дальше всё равно по какому адресу брать значение - скорость та же. |
|||
|
||||
| Fedia |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 465 Регистрация: 2.8.2006 Где: первым встречаю р ассвет Репутация: 8 Всего: 13 |
Параметр const нельзя изменять в вызываемой процедуре.
Параметр же переданный без атрибута (модификатора) можно менять в вызванной процедуре, но при выходе из процедуры переданный параметр останется неизменным. -------------------- Накануне решающей битвы Я иду, и надеждою зыбкой Озаряется эта дорога, Я мечтаю увидеть улыбку На лице победившего Бога… |
|||
|
||||
| ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 2 Всего: 12 |
Понятно
|
|||
|
||||
| digs |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 14.10.2006 Репутация: нет Всего: 1 |
А если Integer извлекаем? При const сначала берем адрес, а по нему берем Integer. Без const берем Integer сразу. Быстрее без const. Хотя надо еще проверить, может в целях оптимизации const на такие вещи не действует: все равно передается значение. Это сообщение отредактировал(а) digs - 30.10.2006, 03:46 |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
А где хранится Integer? В регистрах? Нет. В памяти - по определённому адресу.
Тут ассемблер нужно знать, чтобы понять Код не работает с переменными - он работает со значениями по адресу в памяти. Значение: достали из стека - записали по адресу. Адрес - достали из стека - записали адрес. Работаем в любом случае с адресом в памяти. Если процедура на чистом асме - то выбираем как нам удобнее.
Какое такое "очень длинное?" Добавлено @ 09:48 Если под длинным, подразумевается, что не помещается в 4 байта, то передаётся указатель. Тогда вообще нет разницы. |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
И всё таки, значение вмещающееся в двойное слово передаётся в функцию непосредственно. Переменная размер которой больше чем двойное слово - передаётся по указателю
Я согласен с высказываением bems: А вот, что касаетсяименения аргумента, то тут нужно уточнить дабы не допустить путаницы у менее опытных. Как таковое, значение переданное const нельзя изменять, но это легко обходится, т.к. Delphi "защищает" значение на уровне типов. Следственно получив указатель мы можем делать с значением переданным нам в функции всё что угодно.
Это сообщение отредактировал(а) Yanis - 30.10.2006, 11:24 |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
||||
|
||||
| Fedia |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 465 Регистрация: 2.8.2006 Где: первым встречаю р ассвет Репутация: 8 Всего: 13 |
Не знал о такой возможности, но зачем может понадобиться сначала накладывать ограничения, объявляя параметр функции с атрибутом const, а затем обходить свое же ограничение с использованием указателей ? -------------------- Накануне решающей битвы Я иду, и надеждою зыбкой Озаряется эта дорога, Я мечтаю увидеть улыбку На лице победившего Бога… |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Ну так указатели - это способ уйти от стандартов, сделать недоступное доступным, а код более запутанным и неочевидным, чреватым побочными эффектами.
Даже компилятор вам скажет, что использование указателей небезопасно Но, если очень хочется, то можно Иначе твои коллеги тебя точно не похвалят за то, что константная процедура меняет данные, которые её не доверяли менять. |
|||
|
||||
| vlgr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.9.2006 Репутация: нет Всего: нет |
Неверно. При указании var всегда будет передаваться по указателю. При указании const если аргумент до 4 байт значение, иначе по указателю. |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
Скажу так: это иногда требуется! Так как иногда требуется воспользоваться закрытым виртуальным методом чужого класса Впечатлило?
Добавлено @ 13:47 Snowy А ты для какой версии компилятора говоришь? Delphi какая? |
|||
|
||||
![]()
|
| Правила форума "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. |