estra Опубликовано 13 октября, 2015 Поделиться Опубликовано 13 октября, 2015 Собственно сабж. Пример, где это можно встретить: procedure TForm2.WebBrowser1Tap(Sender: TObject; const [Ref] Point: TPointF); begin end; Цитата Ссылка на комментарий
0 estra Опубликовано 13 октября, 2015 Автор Поделиться Опубликовано 13 октября, 2015 Сам спросил, сам отвечаю - Constant Parameters. Хотя зачем передавать константу по ссылке я не очень понял, ну да ладно, пусть будет раз сделали... Цитата Ссылка на комментарий
0 Администраторы Brovin Yaroslav Опубликовано 13 октября, 2015 Администраторы Поделиться Опубликовано 13 октября, 2015 При const может создаваться копия передаваемых данных. При Ref копия не делается, поэтому есть небольшая выгода по памяти. Цитата Ссылка на комментарий
0 rustam_d Опубликовано 13 октября, 2015 Поделиться Опубликовано 13 октября, 2015 При const может создаваться копия передаваемых данных. При Ref копия не делается, поэтому есть небольшая выгода по памяти. не понял, const это копия? ведь в VCL вроде это и означает ссылку по крайней мере не для объектов... или это опять "свой мир" fmx? Цитата Ссылка на комментарий
0 kami Опубликовано 13 октября, 2015 Поделиться Опубликовано 13 октября, 2015 (изменено) rustam_d, сам с удивлением узнал - оказывается (по крайней мере в Seattle) - не обязательно. Пруф: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Parameters_%28Delphi%29#Constant_Parameters Особенно добила фраза Constant parameters are similar to value parameters Она появилась как минимум в D2010, версии старше просто нет Изменено 13 октября, 2015 пользователем kami Цитата Ссылка на комментарий
0 estra Опубликовано 14 октября, 2015 Автор Поделиться Опубликовано 14 октября, 2015 (изменено) или это опять "свой мир" fmx? Речь не только о fmx, в vcl такая конструкция тоже встроена. При const может создаваться копия передаваемых данных. При Ref копия не делается, поэтому есть небольшая выгода по памяти. Ярослав, вы не могли бы прояснить эту ситуацию? В каких случаях константа передается по ссылке, а в каких по значению? Для fm это (возможно) может зависеть от компилятора, а вот с vcl все еще темнее... Одним словом, как, глядя на код procedure test(const i: Integer), я (как программист) могу понять - константа будет передана по ссылке или по значению? Изменено 14 октября, 2015 пользователем estra Цитата Ссылка на комментарий
0 rustam_d Опубликовано 14 октября, 2015 Поделиться Опубликовано 14 октября, 2015 rustam_d, сам с удивлением узнал - оказывается (по крайней мере в Seattle) - не обязательно. Пруф: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Parameters_%28Delphi%29#Constant_Parameters Особенно добила фраза Constant parameters are similar to value parameters Она появилась как минимум в D2010, версии старше просто нет да уж ссылочка, почитал, кошмар...теперь ведь все проекты при переходе перелопачивать под "const [Ref]"...жескачь т.е. везде в новых проектов писать эти 11 знаков? мдя...ладно 5 ну 11 уже слишком да и код не айс становиться Цитата Ссылка на комментарий
0 Maximus Опубликовано 14 октября, 2015 Поделиться Опубликовано 14 октября, 2015 да уж ссылочка, почитал, кошмар...теперь ведь все проекты при переходе перелопачивать под "const [Ref]"...жескачь т.е. везде в новых проектов писать эти 11 знаков? мдя...ладно 5 ну 11 уже слишком да и код не айс становиться Вообще-то модификатор const никогда не передавал переменную по ссылке, всегда было по значению, ничего не изменилось в этом плане. Наоборот добавили новую возможность передать по ссылке с использованием модификатора const. Цитата Ссылка на комментарий
0 rustam_d Опубликовано 15 октября, 2015 Поделиться Опубликовано 15 октября, 2015 да уж ссылочка, почитал, кошмар...теперь ведь все проекты при переходе перелопачивать под "const [Ref]"...жескачь т.е. везде в новых проектов писать эти 11 знаков? мдя...ладно 5 ну 11 уже слишком да и код не айс становиться Вообще-то модификатор const никогда не передавал переменную по ссылке, всегда было по значению, ничего не изменилось в этом плане. Наоборот добавили новую возможность передать по ссылке с использованием модификатора const. наверно вы правы...люди же для красоты или забавы писали const )) если ваша правда, то значит что указать const что не указать все всегда было одно и тоже...просто делать нечего было...вот и писали const ) Цитата Ссылка на комментарий
0 Maximus Опубликовано 15 октября, 2015 Поделиться Опубликовано 15 октября, 2015 да уж ссылочка, почитал, кошмар...теперь ведь все проекты при переходе перелопачивать под "const [Ref]"...жескачь т.е. везде в новых проектов писать эти 11 знаков? мдя...ладно 5 ну 11 уже слишком да и код не айс становиться Вообще-то модификатор const никогда не передавал переменную по ссылке, всегда было по значению, ничего не изменилось в этом плане. Наоборот добавили новую возможность передать по ссылке с использованием модификатора const. наверно вы правы...люди же для красоты или забавы писали const )) если ваша правда, то значит что указать const что не указать все всегда было одно и тоже...просто делать нечего было...вот и писали const ) Может люди писали его для блокирования возможности изменения переданного параметра? Именно внутри процедуры. Вот вам элементарная проверка, Delphi 7. procedure TForm1.check_const(const b: integer); begin Label2.Caption := Format('%p', [@b]); end; procedure TForm1.check_var(var c: integer); begin Label3.Caption := Format('%p', [@c]); end; procedure TForm1.check(d: integer); begin Label4.Caption := Format('%p', [@d]); end; procedure TForm1.Button1Click(Sender: TObject); var a: integer; begin a := 1; Label1.Caption := Format('%p', [@a]); check_const(a); check_var(a); check(a); end; Только при передаче через var адрес остаётся неизменным, а значит передача идёт по ссылке. Цитата Ссылка на комментарий
0 kami Опубликовано 15 октября, 2015 Поделиться Опубликовано 15 октября, 2015 Неполный пример - Integer, как и pointer укладывается в регистр EAX/EBX или какие_там_сейчас_у_процессоров. С учетом модели вызовов register, используемой в Delphi, для integer выигрыша в передаче по ссылке/по значению нет. Ну, разве что при передаче по ссылке в винде будет PageFault и процессору придется подгружать страничку. Но это крайне маловероятно, с учетом того, что реальное значение было доступно в вызывающем коде. Поэтому и передается по значению. Корректнее было бы сравнить string, record и array, ибо Using const allows the compiler to optimize code for structured - and string-type parameters. Цитата Ссылка на комментарий
0 Maximus Опубликовано 15 октября, 2015 Поделиться Опубликовано 15 октября, 2015 Неполный пример - Integer, как и pointer укладывается в регистр EAX/EBX или какие_там_сейчас_у_процессоров. С учетом модели вызовов register, используемой в Delphi, для integer выигрыша в передаче по ссылке/по значению нет. Ну, разве что при передаче по ссылке в винде будет PageFault и процессору придется подгружать страничку. Но это крайне маловероятно, с учетом того, что реальное значение было доступно в вызывающем коде. Поэтому и передается по значению. Корректнее было бы сравнить string, record и array, ибо Using const allows the compiler to optimize code for structured - and string-type parameters. Да, вы правы. Со string и class получилось также как и с integer, а вот record и array передались по ссылке и в var, и в const. В любом случае ничего не изменилось в этом плане, в последней версии всё аналогично, а значит править ничего не нужно. Цитата Ссылка на комментарий
0 rustam_d Опубликовано 15 октября, 2015 Поделиться Опубликовано 15 октября, 2015 Неполный пример - Integer, как и pointer укладывается в регистр EAX/EBX или какие_там_сейчас_у_процессоров. С учетом модели вызовов register, используемой в Delphi, для integer выигрыша в передаче по ссылке/по значению нет. Ну, разве что при передаче по ссылке в винде будет PageFault и процессору придется подгружать страничку. Но это крайне маловероятно, с учетом того, что реальное значение было доступно в вызывающем коде. Поэтому и передается по значению. Корректнее было бы сравнить string, record и array, ибо Using const allows the compiler to optimize code for structured - and string-type parameters. Да, вы правы. Со string и class получилось также как и с integer, а вот record и array передались по ссылке и в var, и в const. В любом случае ничего не изменилось в этом плане, в последней версии всё аналогично, а значит править ничего не нужно. рад за Kami, а то ведь я видимо пургу нес )) Цитата Ссылка на комментарий
Вопрос
estra
Собственно сабж. Пример, где это можно встретить:
Ссылка на комментарий
12 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.