Delphi постоянные поразрядные выражения

​ ​ ​ ​

6
задан robsoft 22 July 2009 в 10:28
поделиться

5 ответов

Да, компилятор оценивает выражение во время компиляции и использует значение результата как константу. Нет никакого преимущества в объявлении другой константы со значением результата самостоятельно.

EDIT: The_Fox верен. Назначаемые типизированные константы (см. {$ J +} директиву компилятора) не обрабатываются как константы, и в этом случае выражение вычисляется во время выполнения.

7
ответ дан 8 December 2019 в 13:48
поделиться

Вы можете убедиться, что вот так, только для удобства чтения:

const
  KeyRepeatBit = 30;
  KeyRepeatMask = 1 shl KeyRepeatBit ;
4
ответ дан 8 December 2019 в 13:48
поделиться

Он преобразует его в константу во время компиляции.

Однако, даже если бы это было не так, это не оказало бы заметного влияния на производительность вашего приложения.

Вы можете обработать несколько тысяч сообщений в секунду, если ваше приложение занято. Ваш старый Pentium I может делать миллиарды сдвигов и операций в секунду.

Сохраняйте свой код читабельным и профилируйте его, чтобы находить узкие места, которые вы затем оптимизируете - обычно глядя на алгоритм, а не на такой низкий уровень, как вы? переключается или нет.

3
ответ дан 8 December 2019 в 13:48
поделиться

Я сомневаюсь что использование числа (кстати, 1073741824) действительно улучшит производительность. Кажется, вы попадаете в какой-то контекст сообщения Windows, и это, возможно, добавит больше задержки, чем одно, и это молниеносно, даже если число не оптимизировано во время компиляции (в любом случае, я думаю, что это оптимизировано).

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

2
ответ дан 8 December 2019 в 13:48
поделиться

Возможно, ваш вопрос не по теме, но я использую запись случая для подобных вещей, например:

  TlParamRecord = record
    case Integer of
      0: (
        RepeatCount: Word;
        ScanCode: Byte;
        Flags: Set of (lpfExtended, lpfReserved=4, lpfContextCode,
          lpfPreviousKeyState, lpfTransitionState);
      );
      1: (lParam: LPARAM);
  end;

см. статья в моем блоге для получения дополнительных сведений

1
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: