Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2022, 12:42   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Константа типа рекорд

Вводные данные, чисто для теста
Код:
type
  eee=record
    a:byte;
    b:string;
    c:word;
  end;
Код:
const
  ddd:eee=(a:1; b:'1233'; c:3);
Сам код:
Код:
Procedure fff(q:eee);
var
  w:LongWord;
begin
  asm
    mov eax, q.b
    mov w, eax
  end;
  Form1.Label2.Caption:=IntToStr(w);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  w:longWord;
begin
  fff(ddd);
  asm
    mov eax, ddd.b
    mov w, eax
  end;
  Label3.Caption:=IntToStr(w);
end;
Результат адресов выведенных в лейблы одинаковый

А теперь внимание! Добавляю слово const в параметры
Код:
Procedure fff(const q:eee);
И теперь уже получаются совершенно разные результаты адресов

То есть, без const идет ссылка на record а если с const - то тогда весь этот рекорд дублируется при вызове процедуры?
Kronos913 вне форума Ответить с цитированием
Старый 06.09.2022, 12:44   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Собственно для чего я это тестирую:
Есть одна процедура, которая вызывается с огромной кучей параметров

И я хочу, чтобы все эти параметры были записаны один раз в константу рекорд и не дублировались в памяти при вызове процедуры
Kronos913 вне форума Ответить с цитированием
Старый 06.09.2022, 12:56   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Общий вопрос:
Как передать константу record в процедуру так, чтобы она передалась по ссылке, а не копированием переменной?
Kronos913 вне форума Ответить с цитированием
Старый 06.09.2022, 13:02   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Код:
type
  eee=record
    a:byte;
    b:string;
    c:word;
  end;
  ttt=^eee;
Код:
Procedure fff(q:ttt);
Код:
const
  rrr:eee = (a:1; b:'1233'; c:3);
И вызов
Код:
fff(@rrr);
То так это будет нормально работать? Все будет передаваться по ссылке?
Kronos913 вне форума Ответить с цитированием
Старый 06.09.2022, 16:29   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так в процедуру будет передаваться указатель на ту самую структуру, которую вы использовали как аргумент с собакой. По сути это и есть то, что вам нужно. При использовании const вам приходит указатель на копию, чтобы исходная структура не могла быть изменена.
macomics вне форума Ответить с цитированием
Старый 07.09.2022, 00:25   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Компилирую файл и не понимаю, что за ерунда:
Два варианта
1. Передавать в процедуру 20 параметров
2. Создать константу record с 20 параметрами и передавать ссылку на нее

Вопрос: почему первый вариант оказывается оптимальнее? Внезапно, так меньше размер исходника
Kronos913 вне форума Ответить с цитированием
Старый 07.09.2022, 01:33   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А вам нужен меньший размер исходника или скорость работы. Дайте определение оптимальности?
macomics вне форума Ответить с цитированием
Старый 07.09.2022, 01:48   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Вопрос: почему первый вариант оказывается оптимальнее? Внезапно, так меньше размер исходника
Тоже внезапно. А чем он меньше?
northener вне форума Ответить с цитированием
Старый 07.09.2022, 14:02   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
При использовании const вам приходит указатель на копию, чтобы исходная структура не могла быть изменена.
Не совсем так. По указателю как раз изменить исходные данные можно. И доступ к данным контролируется на уровне компиляторы. В случае использования var также передается указатель, но данные можно менять. Смысл const в том, чтобы не копировать структуру при вызове подпрограммы, а передавать лишь указатель.
Arigato вне форума Ответить с цитированием
Старый 07.09.2022, 14:10   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тут копирование происходит потому, что создается второй объект с const - не изменяемый. И на него передается указатель.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекорд одновременного пребывания на форуме digitalis О форуме и сайтах клуба 3 24.06.2019 22:49
что за константа HTTqp Общие вопросы Delphi 3 01.09.2015 15:17
Константа Михаил Юрьевич Общие вопросы Delphi 2 16.11.2014 22:47
Константа ideasforlife Общие вопросы C/C++ 6 09.05.2011 16:06
что такое константа? if-soft Паскаль, Turbo Pascal, PascalABC.NET 11 14.10.2008 19:19