Перейти к содержанию
Fire Monkey от А до Я
  • 0

Что такое [Ref]?


estra

Вопрос

Рекомендуемые сообщения

  • 0
  • Администраторы
  • При const может создаваться копия передаваемых данных.
  • При Ref копия не делается, поэтому есть небольшая выгода по памяти.
Ссылка на комментарий
  • 0
  • При const может создаваться копия передаваемых данных.
  • При Ref копия не делается, поэтому есть небольшая выгода по памяти.

не понял, const это копия? ведь в VCL вроде это и означает ссылку по крайней мере не для объектов...

или это опять "свой мир" fmx?

Ссылка на комментарий
  • 0

rustam_d, сам с удивлением узнал - оказывается (по крайней мере в Seattle) - не обязательно.

Пруф: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Parameters_%28Delphi%29#Constant_Parameters

 

Особенно добила фраза

Constant parameters are similar to value parameters

 

Она появилась как минимум в D2010, версии старше просто нет :)

Изменено пользователем kami
Ссылка на комментарий
  • 0

или это опять "свой мир" fmx?

Речь не только о fmx, в vcl такая конструкция тоже встроена.

 

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

 

Ярослав, вы не могли бы прояснить эту ситуацию? В каких случаях константа передается по ссылке, а в каких по значению? Для fm это (возможно) может зависеть от компилятора, а вот с vcl все еще темнее... Одним словом, как, глядя на код procedure test(const i: Integer), я (как программист) могу понять - константа будет передана по ссылке или по значению?

Изменено пользователем estra
Ссылка на комментарий
  • 0

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

да уж ссылочка, почитал, кошмар...теперь ведь все проекты при переходе перелопачивать под "const [Ref]"...жескачь 

т.е. везде в новых проектов писать эти 11 знаков? мдя...ладно 5 ну 11 уже слишком да и код не айс становиться

 

 

Вообще-то модификатор const никогда не передавал переменную по ссылке, всегда было по значению, ничего не изменилось в этом плане. Наоборот добавили новую возможность передать по ссылке с использованием модификатора const.

Ссылка на комментарий
  • 0

 

да уж ссылочка, почитал, кошмар...теперь ведь все проекты при переходе перелопачивать под "const [Ref]"...жескачь 

т.е. везде в новых проектов писать эти 11 знаков? мдя...ладно 5 ну 11 уже слишком да и код не айс становиться

 

 

Вообще-то модификатор const никогда не передавал переменную по ссылке, всегда было по значению, ничего не изменилось в этом плане. Наоборот добавили новую возможность передать по ссылке с использованием модификатора const.

 

наверно вы правы...люди же для красоты или забавы писали const ))

если ваша правда, то значит что указать const что не указать все всегда было одно и тоже...просто делать нечего было...вот и писали const )

Ссылка на комментарий
  • 0

 

 

да уж ссылочка, почитал, кошмар...теперь ведь все проекты при переходе перелопачивать под "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;

779ae5d469438cc326c1454a2c9dd2cc.jpg

 

Только при передаче через var адрес остаётся неизменным, а значит передача идёт по ссылке.

Ссылка на комментарий
  • 0

Неполный пример - 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

 

Неполный пример - 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

 

 

Неполный пример - 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, а то ведь я видимо пургу нес ))

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...