Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 const параметры  [new]
smskin
Member [заблокирован]

Откуда: Россия
Сообщений: 439
Не до конца понятен смысл const параметров в delphi.
Ну то что изменять их значение внутри процедуры нельзя - это понятно.
Непонятно передаются ли const параметры по ссылке или по значению?
9 сен 08, 13:02    [6163307]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Это дело компилятора, чаще всего по ссылке.

--
http://www.podgoretsky.com
9 сен 08, 13:07    [6163331]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Ega
Member

Откуда: Дубна
Сообщений: 4531
smskin
Не до конца понятен смысл const параметров в delphi.
Ну то что изменять их значение внутри процедуры нельзя - это понятно.
Непонятно передаются ли const параметры по ссылке или по значению?


А какая разница, каким образом там в кишках это дело устроено? Причем, насколько я понимаю, это дело может меняться при изменении компилятора.
9 сен 08, 13:13    [6163367]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
x77
Member

Откуда:
Сообщений: 1747
smskin
Ну то что изменять их значение внутри процедуры нельзя - это понятно.


если передавался объект - его свойства менять можно, всегда.

официальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов. можно, конечно, попытаться прикинуть, в чём могли бы заключаться такие оптимизации, только вот нафига?

с точки зрения более высокого уровня, т.е. концепций ООП, такие параметры нужны для исключения логических ошибок на этапе написания кода. например, чтобы какой особо одарённый пионер не вздумал менять дескриптор подключения к СУБД или там оконный хэндл.
9 сен 08, 13:30    [6163475]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
vunder
Member

Откуда: СПб
Сообщений: 121
Дело не только в логике программного кода. При всей вашей полемике вы забываете, что передача параметров в подпрограмму возможно ТОЛЬКО 2 способами: по значению и по ссылке. В первом случае значение переменной копируется в стэк и передается через него в подпрограмму. При передачи по указателю в стэк копируется только ссылка на переменную. В Delphi/Pascal для объявления передачи параметров по значеню не надо указывать никаких дополнительный директив. Использование const и var определят рабочу с переменными через указатели. Для программиста это всего лишь будет означать некоторые особенност испольвания таких переменных, а вот для компилятора - совсем другое дело.
P.S. Маленький совет: все переменный, размер которых превышает 4 байта лучше объявлять как const (ну или var, если значение будет меняться). В этом случае, например при передачи строковых параметров, будет расходоваться меньше памяти, т.к. при передачи больших переменных по значению они будут полностью дублироваться.
9 сен 08, 15:46    [6164668]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
vunder
Member

Откуда: СПб
Сообщений: 121
Кстати, передача объекта всегда производиться по указателю. Единственный нюанс - директива var. Если объект был передан с ее помощью, то изменение параметра внутри подпрограммы изменит и его значение в основном коде.
9 сен 08, 15:49    [6164710]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
alex0
Member

Откуда: 127.0.0.1
Сообщений: 7203
vunder
Кстати, передача объекта всегда производиться по указателю. Единственный нюанс - директива var. Если объект был передан с ее помощью, то изменение параметра внутри подпрограммы изменит и его значение в основном коде.

А если объект был передан без var, то изменение параметра внутри подпрограммы все равно изменит и его значение в основном коде
procedure TMainForm.Button1Click(Sender: TObject);
begin
  (Sender as TButton).Caption := 'Кликнули по мне';
end;
9 сен 08, 17:04    [6165373]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Альт
Member

Откуда: Сибирь
Сообщений: 4581
const - это передача по ссылке для структур... а объект - это и так ссылка... его передавай хоть так, хоть эдак... в 32-ух битой адресации памяти при 32 битных регистрах разницы не будет...
зы: попробуйте передать в функцию 4 гигабайтный массив не по ссылке )
9 сен 08, 17:19    [6165487]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53537
Блог
Ega
А какая разница, каким образом там в кишках это дело устроено?

Любопытно, как Вы отнесетесь к врачу, исповедующему этот подход.

x77
с точки зрения более высокого уровня, т.е. концепций ООП, такие параметры нужны для исключения логических ошибок на этапе написания кода.

Бред.

vunder
При всей вашей полемике вы забываете, что передача параметров в подпрограмму возможно ТОЛЬКО 2 способами: по значению и по ссылке.

Чтобы утверждение не было бредом, добавляйте "в Delphi".

vunder
В первом случае значение переменной копируется в стэк

Бред.

vunder
Использование const и var определят рабочу с переменными через указатели.

Ну-ну.

vunder
В этом случае, например при передачи строковых параметров, будет расходоваться меньше памяти, т.к. при передачи больших переменных по значению они будут полностью дублироваться.

Бред.
9 сен 08, 17:38    [6165644]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59008

softwarer, чем обвинить всех в бреде (с чем я не спорю, т.к. действительно бред),
лучше бы дали краткое описание своего видения вопроса. Ну или ссылку на одно
из многочисленных объяснений. :)


Posted via ActualForum NNTP Server 1.4

9 сен 08, 17:54    [6165739]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53537
Блог
Гаджимурадов Рустам
лучше бы дали краткое описание своего видения вопроса.

Оно уже давно приведено в топике: официальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов.
9 сен 08, 19:31    [6166091]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Альт
Member

Откуда: Сибирь
Сообщений: 4581
softwarer
vunder
При всей вашей полемике вы забываете, что передача параметров в подпрограмму возможно ТОЛЬКО 2 способами: по значению и по ссылке.

Чтобы утверждение не было бредом, добавляйте "в Delphi".

вот... тут у меня вопрос... предполагаю, появление в ответе что-то типа функциональных языков.... но чем теперь обозначать "Delphi"? для меня это rad
9 сен 08, 20:02    [6166154]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
автор
официальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов.

Вообще то это не цель, а цель
автор
A constant (const) parameter is like a local constant or read-only variable. Constant parameters are similar to value parameters, except that you can't assign a value to a constant parameter within the body of a procedure or function, nor can you pass one as a var parameter to another routine. (But when you pass an object reference as a constant parameter, you can still modify the object's properties.)

А оптимизация побочный эффект
автор
Using const allows the compiler to optimize code for structured- and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.

При указании данного модификатора, компилятор может сохранить несколько тактов, не делая некоторых проверок и сохранений, которые пришлось бы сделать, при модификаторе var. Естественно это действует для структурных типов и строк.

--
http://www.podgoretsky.com
9 сен 08, 20:39    [6166206]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53537
Блог
Anatoly Podgoretsky
Вообще то это не цель, а цель ... А оптимизация побочный эффект

Ровно наоборот. То, что Вы называете целью, если рассмотреть его именно как "цель, к которой надо стремиться", мягко говоря, нафиг не нужно. На самом деле это не цель, а нечто вроде подсказки компилятору - добровольно принимаемое обязательство, которое позволяет компилятору сгенерировать более эффективный код.

Собственно, рано или поздно компиляторы научатся самостоятельно распознавать возможность такой оптимизации, и модификатор const станет устаревшим. Однако, как мы знаем, существуют возможности работы через указатели, что воздвигает перед подобной автоматикой серьезные препятствия.
9 сен 08, 21:30    [6166266]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: const параметры  [new]
и все-таки
Guest
А как на самом деле передаются const параметры? Если функция с const параметром в dll, и надо вызвать ее из C++. На стеке должно быть значение или адрес?
23 май 12, 11:20    [12599309]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53537
Блог
и все-таки
А как на самом деле передаются const параметры? Если функция с const параметром в dll, и надо вызвать ее из C++. На стеке должно быть значение или адрес?

Подозреваю, это зависит ещё и от конвенции вызовов. В обычной для дельфи register все параметры размером больше int-а передаются по ссылке, а дальше пролог функции по необходимости копирует значение в локальную память. Модификатор const собственно отменяет такое копирование, позволяя действовать прямо по переданному указателю. Если написать const например с int-параметром - подозреваю, он всё равно будет передаваться по значению, то есть игнорируя const. Не пробовал. А как оно будет вести себя, например, в cdecl - вопрос отдельной интересности.
23 май 12, 12:05    [12599839]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5064
Anatoly Podgoretsky
Это дело компилятора, чаще всего по ссылке.
всегда по ссылке
23 май 12, 12:06    [12599847]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5064
x77
smskin
Ну то что изменять их значение внутри процедуры нельзя - это понятно.


если передавался объект - его свойства менять можно, всегда.

официальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов. можно, конечно, попытаться прикинуть, в чём могли бы заключаться такие оптимизации, только вот нафига?

с точки зрения более высокого уровня, т.е. концепций ООП, такие параметры нужны для исключения логических ошибок на этапе написания кода. например, чтобы какой особо одарённый пионер не вздумал менять дескриптор подключения к СУБД или там оконный хэндл.
Вы упустили очень важный момент. Объявление параметра константой и передача оного по ссылке в первую очередь необходимо для исключения копирования "длинных" параметров (типа строк) в стек вызываемой процедуры.
23 май 12, 12:09    [12599884]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53537
Блог
Квейд
Объявление параметра константой и передача оного по ссылке в первую очередь необходимо для исключения копирования "длинных" параметров (типа строк) в стек вызываемой процедуры.

Строки не копируются в стек вызываемой процедуры. У них при отсутствии const просто инкрементируется счётчик ссылок.
23 май 12, 12:10    [12599897]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
spider13
Member

Откуда: http://spider13.net
Сообщений: 944
softwarer,

даже у wideString?
23 май 12, 12:12    [12599917]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
spider13
softwarer,

даже у wideString?

у wideString нет счетчика ссылок.
23 май 12, 12:18    [12599970]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5064
Квейд
Anatoly Podgoretsky
Это дело компилятора, чаще всего по ссылке.
всегда по ссылке
Прошу меня извинить, не всегда.
23 май 12, 12:19    [12599985]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Квейд
Anatoly Podgoretsky
Это дело компилятора, чаще всего по ссылке.
всегда по ссылке

Можешь привести ссылку на справку, где такое сказано?
23 май 12, 12:21    [12600004]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
На эксперименты или на анализ ассемблерного кода можешь не ссылаться.
23 май 12, 12:22    [12600025]     Ответить | Цитировать Сообщить модератору
 Re: const параметры  [new]
spider13
Member

Откуда: http://spider13.net
Сообщений: 944
Anatoly Podgoretsky
spider13
softwarer,

даже у wideString?

у wideString нет счетчика ссылок.


Правильно, что в таком случае увеличивать)

Вообще, насколько я понял, то прямые значения передаются для числовых типов, для остальных же это ссылка, но могу ошибаться.
23 май 12, 12:26    [12600076]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить