with и без with

Квейд
Дата: 08.01.2020 11:36:18
type
  TRecord = record
    A: Integer;
    B: Integer;
    C: Double;
  end;

  TRecordArray = array of TRecord;

procedure TForm9.FormCreate(Sender: TObject);
var
  RA: TRecordArray;
begin
  SetLength(RA, 10);
  with RA[1] do
  begin
    A := 3;
    B := 2;
    C := 1;
  end;
  RA[1].A := 3;
  RA[1].B := 2;
  RA[1].C := 1;
end;


Я думал, компилятор выделенное давно умеет оптимизировать...
makhaon
Дата: 08.01.2020 12:27:51
в том числе поэтому я за with.
Kazantsev Alexey
Дата: 08.01.2020 13:06:01
Квейд,

Решается дополнительной локальной переменной (указатель на TRecord), их компилятор умеет раскладывать по регистрам если ему не мешать. with, в текущем её виде, очень опасная конструкция.
alekcvp
Дата: 08.01.2020 15:13:31
Квейд,

А оптимизацию в debug-сборке включили?..
Kazantsev Alexey
Дата: 08.01.2020 15:29:52
alekcvp,

Я проверял релизную сборку и сморел внешним дизассемблером. Оптимизации это не про дельфю.
Квейд
Дата: 08.01.2020 17:10:19
alekcvp
Квейд,

А оптимизацию в debug-сборке включили?..
разумеется
Kazantsev Alexey
Дата: 08.01.2020 17:16:57
Посмотрел FPC, он в обоих вариантах обновляет значение EAX. Дополнительная переменная ему тоже помогает.
Kazantsev Alexey
Дата: 08.01.2020 17:58:49
Посмотрел ещё Oxygene... Он вообще выкинул лишние операции, оставив только однократное присваивание. А чтобы он и его не выкинул пришлось в конце метода добавить вывод в консоль. Вот что LLVM животворящий умело приготовленный делает. Эх... :(
Sapersky
Дата: 08.01.2020 18:36:15
Это только с динамическим массивом, а вот с таким
PRecordArray = ^TRecordArray;
TRecordArray = array[0..9] of TRecord;
нормально оптимизирует. И вроде бы с дин. массивом переданным как const.
Sapersky
Дата: 08.01.2020 19:29:27
Kazantsev Alexey
Вот что LLVM животворящий умело приготовленный делает. Эх... :(
Можно и к fpc прикрутить LLVM, но не под Виндой.
https://wiki.freepascal.org/LLVM#Build_FPC_with_LLVM_support