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 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.