Квейд
Дата: 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