Ответить на комментарий

Нельзя ли переделать ShaReflectedRefreshCRC64 в функцию?

Мешают эстетические соображения.

Компилятор 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 пока остается процедурой.

Ответить

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <h1> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <pre>, <code>, <asm>, <c>, <cpp>, <delphi>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>, <mytext>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Подробнее о форматировании

CAPTCHA
Ведите текст с изображения. (вводить еще раз после предпросмотра а то не добавится комментарий)
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.