Компилятор Delphi всегда размещает переменные типа int64 в оперативной памяти. По моим наблюдениям, в регистрах он может держать их только во время вычисления одного оператора. Кроме того, передачу параметров типа int64 по значению компилятор Delphi выполняет через стек. Получается, что после такой переделки при последовательных вызовах функции каждый раз текущее значение CRC64 (два двойных слова) будет копироваться из оперативной памяти на стек (т.е. опять же в оперативную память). В то время как сейчас просто выполняется загрузка адреса параметра.
Давайте посмотрим в окне CPU, какую последовательность инструкций компилятор генерирует при различных вариантах передачи параметров, на следующем примере:
function fval(a: int64): int64;
begin;
Result:=a;
end;
function fconst1(const a: int64): int64;
begin;
Result:=a;
end;
function fconst2(const a): int64;
begin;
Result:=int64(a);
end;
function fvar(var a: int64): int64;
begin;
Result:=a;
end;
procedure TForm1.Button3Click(Sender: TObject);
const
c=$0807060504030201;
var
a, b: int64;
begin;
a:=fval(c); //push
b:=fconst1(c); //push
a:=a+fval(b); //push
b:=b+fconst1(a); //push
a:=a+fconst2(b); //lea
b:=b+fvar(a); //lea
ShowMessage(IntToHex(b,16));
end;
Видно, что только в двух последних случаях компилятор Delphi использует передачу параметра по ссылке. Однако предпоследний вариант мне кажется недостаточно правильным, т.к. в нем не производится проверка типа. Кроме того, он не позволяет передавать константу -1. Поэтому процедура ShaReflectedRefreshCRC64 пока остается процедурой.
Нельзя ли переделать ShaReflectedRefreshCRC64 в функцию?
Мешают эстетические соображения.
Компилятор Delphi всегда размещает переменные типа int64 в оперативной памяти. По моим наблюдениям, в регистрах он может держать их только во время вычисления одного оператора. Кроме того, передачу параметров типа int64 по значению компилятор Delphi выполняет через стек. Получается, что после такой переделки при последовательных вызовах функции каждый раз текущее значение CRC64 (два двойных слова) будет копироваться из оперативной памяти на стек (т.е. опять же в оперативную память). В то время как сейчас просто выполняется загрузка адреса параметра.
Давайте посмотрим в окне CPU, какую последовательность инструкций компилятор генерирует при различных вариантах передачи параметров, на следующем примере:
Видно, что только в двух последних случаях компилятор Delphi использует передачу параметра по ссылке. Однако предпоследний вариант мне кажется недостаточно правильным, т.к. в нем не производится проверка типа. Кроме того, он не позволяет передавать константу -1. Поэтому процедура ShaReflectedRefreshCRC64 пока остается процедурой.