|
|
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Не до конца понятен смысл const параметров в delphi. Ну то что изменять их значение внутри процедуры нельзя - это понятно. Непонятно передаются ли const параметры по ссылке или по значению? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 13:02 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Это дело компилятора, чаще всего по ссылке. -- http://www.podgoretsky.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 13:07 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
smskinНе до конца понятен смысл const параметров в delphi. Ну то что изменять их значение внутри процедуры нельзя - это понятно. Непонятно передаются ли const параметры по ссылке или по значению? А какая разница, каким образом там в кишках это дело устроено? Причем, насколько я понимаю, это дело может меняться при изменении компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 13:13 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
smskinНу то что изменять их значение внутри процедуры нельзя - это понятно. если передавался объект - его свойства менять можно, всегда. официальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов. можно, конечно, попытаться прикинуть, в чём могли бы заключаться такие оптимизации, только вот нафига? с точки зрения более высокого уровня, т.е. концепций ООП, такие параметры нужны для исключения логических ошибок на этапе написания кода. например, чтобы какой особо одарённый пионер не вздумал менять дескриптор подключения к СУБД или там оконный хэндл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 13:30 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Дело не только в логике программного кода. При всей вашей полемике вы забываете, что передача параметров в подпрограмму возможно ТОЛЬКО 2 способами: по значению и по ссылке. В первом случае значение переменной копируется в стэк и передается через него в подпрограмму. При передачи по указателю в стэк копируется только ссылка на переменную. В Delphi/Pascal для объявления передачи параметров по значеню не надо указывать никаких дополнительный директив. Использование const и var определят рабочу с переменными через указатели. Для программиста это всего лишь будет означать некоторые особенност испольвания таких переменных, а вот для компилятора - совсем другое дело. P.S. Маленький совет: все переменный, размер которых превышает 4 байта лучше объявлять как const (ну или var , если значение будет меняться). В этом случае, например при передачи строковых параметров, будет расходоваться меньше памяти, т.к. при передачи больших переменных по значению они будут полностью дублироваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 15:46 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Кстати, передача объекта всегда производиться по указателю. Единственный нюанс - директива var . Если объект был передан с ее помощью, то изменение параметра внутри подпрограммы изменит и его значение в основном коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 15:49 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
vunderКстати, передача объекта всегда производиться по указателю. Единственный нюанс - директива var . Если объект был передан с ее помощью, то изменение параметра внутри подпрограммы изменит и его значение в основном коде. А если объект был передан без var , то изменение параметра внутри подпрограммы все равно изменит и его значение в основном коде Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 17:04 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
const - это передача по ссылке для структур... а объект - это и так ссылка... его передавай хоть так, хоть эдак... в 32-ух битой адресации памяти при 32 битных регистрах разницы не будет... зы: попробуйте передать в функцию 4 гигабайтный массив не по ссылке ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 17:19 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
EgaА какая разница, каким образом там в кишках это дело устроено? Любопытно, как Вы отнесетесь к врачу, исповедующему этот подход. x77с точки зрения более высокого уровня, т.е. концепций ООП, такие параметры нужны для исключения логических ошибок на этапе написания кода. Бред. vunderПри всей вашей полемике вы забываете, что передача параметров в подпрограмму возможно ТОЛЬКО 2 способами: по значению и по ссылке. Чтобы утверждение не было бредом, добавляйте "в Delphi". vunderВ первом случае значение переменной копируется в стэк Бред. vunderИспользование const и var определят рабочу с переменными через указатели. Ну-ну. vunderВ этом случае, например при передачи строковых параметров, будет расходоваться меньше памяти, т.к. при передачи больших переменных по значению они будут полностью дублироваться. Бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 17:38 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
softwarer, чем обвинить всех в бреде (с чем я не спорю, т.к. действительно бред), лучше бы дали краткое описание своего видения вопроса. Ну или ссылку на одно из многочисленных объяснений. :) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 17:54 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустамлучше бы дали краткое описание своего видения вопроса. Оно уже давно приведено в топике: официальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 19:31 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
softwarer vunderПри всей вашей полемике вы забываете, что передача параметров в подпрограмму возможно ТОЛЬКО 2 способами: по значению и по ссылке. Чтобы утверждение не было бредом, добавляйте "в Delphi". вот... тут у меня вопрос... предполагаю, появление в ответе что-то типа функциональных языков.... но чем теперь обозначать "Delphi"? для меня это rad ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 20:02 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
авторофициальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов. Вообще то это не цель, а цель автор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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 20:39 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Anatoly PodgoretskyВообще то это не цель, а цель ... А оптимизация побочный эффект Ровно наоборот. То, что Вы называете целью, если рассмотреть его именно как "цель, к которой надо стремиться", мягко говоря, нафиг не нужно. На самом деле это не цель, а нечто вроде подсказки компилятору - добровольно принимаемое обязательство, которое позволяет компилятору сгенерировать более эффективный код. Собственно, рано или поздно компиляторы научатся самостоятельно распознавать возможность такой оптимизации, и модификатор const станет устаревшим. Однако, как мы знаем, существуют возможности работы через указатели, что воздвигает перед подобной автоматикой серьезные препятствия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2008, 21:30 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
А как на самом деле передаются const параметры? Если функция с const параметром в dll, и надо вызвать ее из C++. На стеке должно быть значение или адрес? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 11:20 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
и все-такиА как на самом деле передаются const параметры? Если функция с const параметром в dll, и надо вызвать ее из C++. На стеке должно быть значение или адрес? Подозреваю, это зависит ещё и от конвенции вызовов. В обычной для дельфи register все параметры размером больше int-а передаются по ссылке, а дальше пролог функции по необходимости копирует значение в локальную память. Модификатор const собственно отменяет такое копирование, позволяя действовать прямо по переданному указателю. Если написать const например с int-параметром - подозреваю, он всё равно будет передаваться по значению, то есть игнорируя const. Не пробовал. А как оно будет вести себя, например, в cdecl - вопрос отдельной интересности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:05 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Anatoly PodgoretskyЭто дело компилятора, чаще всего по ссылке. всегда по ссылке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:06 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
x77 smskinНу то что изменять их значение внутри процедуры нельзя - это понятно. если передавался объект - его свойства менять можно, всегда. официальная документация утверждает, что объявление параметра константой служит для неких оптимизаций, проводимых компилятором, и касающихся структурированных и строковых типов. можно, конечно, попытаться прикинуть, в чём могли бы заключаться такие оптимизации, только вот нафига? с точки зрения более высокого уровня, т.е. концепций ООП, такие параметры нужны для исключения логических ошибок на этапе написания кода. например, чтобы какой особо одарённый пионер не вздумал менять дескриптор подключения к СУБД или там оконный хэндл.Вы упустили очень важный момент. Объявление параметра константой и передача оного по ссылке в первую очередь необходимо для исключения копирования "длинных" параметров (типа строк) в стек вызываемой процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:09 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
КвейдОбъявление параметра константой и передача оного по ссылке в первую очередь необходимо для исключения копирования "длинных" параметров (типа строк) в стек вызываемой процедуры. Строки не копируются в стек вызываемой процедуры. У них при отсутствии const просто инкрементируется счётчик ссылок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:10 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
softwarer, даже у wideString? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:12 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
spider13softwarer, даже у wideString? у wideString нет счетчика ссылок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:18 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
КвейдAnatoly PodgoretskyЭто дело компилятора, чаще всего по ссылке. всегда по ссылкеПрошу меня извинить, не всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:19 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
КвейдAnatoly PodgoretskyЭто дело компилятора, чаще всего по ссылке. всегда по ссылке Можешь привести ссылку на справку, где такое сказано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:21 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
На эксперименты или на анализ ассемблерного кода можешь не ссылаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:22 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Anatoly Podgoretskyspider13softwarer, даже у wideString? у wideString нет счетчика ссылок. Правильно, что в таком случае увеличивать) Вообще, насколько я понял, то прямые значения передаются для числовых типов, для остальных же это ссылка, но могу ошибаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:26 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Anatoly PodgoretskyНа эксперименты или на анализ ассемблерного кода можешь не ссылаться. 12599985 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2012, 12:39 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Извините, что поднимаю тему старую, просто не вижу смысла создавать новую. Вопрос опять же по const. Почитал, что разницы нет в этом коде: Код: pascal 1. 2. ну кроме того, что const запрещает изменять свойства объекта. Проверил: добавил строку Код: pascal 1. и никаких ошибок компилятор не выдал. И если const запрещает изменение объекта, то почему процедура Код: pascal 1. выполняется тоже без проблем. Тогда вопрос. Для каких типов объектов актуально использовать const при передаче параметров? String не в счёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:25 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:29 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11ну кроме того, что const запрещает изменять свойства объекта. Где такое сказано ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:29 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11ну кроме того, что const запрещает изменять свойства объекта.Где ты такое прочитал? const запрещает присваивать значение самому объекту Код: pascal 1. X11 Тогда вопрос. Для каких типов объектов актуально использовать const при передаче параметров? Для типов, размер которых превышает машинное слово, чтобы избежать ненужного копирования в памяти и для типов, с управляемым временем жизни, чтобы избежать передергивания счетчика ссылок. Т.е. для Win64: Интерфейсы Строки Записи Массивы Variant Extended Для Win32: Win64 + Int64 Double (TDateTime) Для мобильных платформ + объекты (ибо у них есть счетчик ссылок) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:36 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
DimaBrX11ну кроме того, что const запрещает изменять свойства объекта. Где такое сказано ? потерял ссылку... лень искать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:41 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovX11, потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства а разве когда передаёшь переменную string, то меняется адрес? или я не понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:42 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
В Билдере это. В Билдере нельзя, в Delphi - можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:43 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_X11ну кроме того, что const запрещает изменять свойства объекта.Где ты такое прочитал? я не прочитал, а сделал вывод самостоятельно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:43 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, наверное, ссылка на какого-нибудь выдумщика была. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:43 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, Код: pascal 1. 2. В приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс. На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса. Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Но в случае, если параметр имеет тип: 1. string, массив или variant: их длинна может быть не ограниченна, и копирование будет затратным. С Const копирования не будет. 2. Interface: каждый раз, когда его будут передавать в качестве параметра, его RefCount будет увеличиваться на 1, а при выходе из метода - уменьшаться на 1. В случае const этого происходить не будет. 3. Во всех остальных случаях, особой разницы нет. Копирование 4-16 байт не сделает разницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:48 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_const запрещает присваивать значение самому объекту Код: pascal 1. аааа, я понял, свойства менять можно, но вот присваивать что-то самому объекту напрямую нельзя: Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:48 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Valery_BВ приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс. На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса. Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:52 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11 >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const? Нет. Будет создана ещё одна ссылка на экземпляр этого класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:53 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11Valery_BВ приведённом тобой примере, действительно нет разницы, т.к. BarManager - это класс. На ассемблере, это будет одно и тоже - как ссылка на адрес в памяти на экземпляр этого класса. Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. >>>Без const компилятор делает локальную копию переменной, которую передали в качестве параметра. Вот опять мне не понятно. Получается, будет создан ещё один экземпляр BarManager если не подставить const? Переменной является ССЫЛКА на экземпляр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:57 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:58 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
Valery_BНет. Будет создана ещё одна ссылка на экземпляр этого класса. КотовасияПеременной является ССЫЛКА на экземпляр. теперь доходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:00 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11Aleksandr SharahovX11, потому что параметр BarManager (т.е. адрес памяти) не меняется, меняются его свойства а разве когда передаёшь переменную string, то меняется адрес? или я не понял? const запрещает менять переданное, а объект передается как адрес. Когда изменяешь свойства объекта, его положение в памяти не меняется. Изменить объект = присвоить значение самому объекту, и его положение в памяти в общем случае может измениться. Со строками работает магия компилятора. Да, когда изменяешь символы строки, ее положение в памяти в общем случае может измениться. Но главное дело в магии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:00 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
В основном заповедь такая: 1) на простые типы (булевы, символы, числа, даже вещественные, указатели) const ничего не дает, т.к. все равно в подпрограмму передается копия 1.1) если указатель - это объект, то в режиме ARC (auto ref count, для мобильных платформ) см. правило для интерфейса 2) на все остальные (записи, массивы, строки, интерфейсы) - не помешает, и даже даст выигрыш производительности. Плюс защитит от класса ошибок типа procedure(s: string) begin s:='foo'; end 3) если параметр исключительно выходной, то лучше объявлять его out, а не var. var для тех, у кого читается значение на входе и меняется на выходе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:44 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
DimaBr, а слона-то я и не заметил спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 15:04 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
white_nigger, подготовка к пятнице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 20:19 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
white_nigger, ты про что именно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 12:40 |
|
||
|
const параметры
|
|||
|---|---|---|---|
|
#18+
X11white_nigger, ты про что именно?Про первые главы "Delphi для чайников". Вроде не пятница ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 14:42 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2040444]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
203ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
| others: | 209ms |
| total: | 526ms |

| 0 / 0 |
