2009-07-22 2 views
6

Возможно, это глупый вопрос, но для меня это праздное любопытство.Постоянные поразрядные выражения Delphi

У меня есть код Delphi, который выглядит так:

 
const 
    KeyRepeatBit = 30; 

... 
    // if bit 30 of lParam is set, mark this message as handled 
    if (Msg.lParam and (1 shl KeyRepeatBit) > 0) then 
    Handled:=true; 
... 

(цель кода не очень важно)

ли компилятор видеть «(1 ЗЫ KeyRepeatBit)», как-то, что можно вычислить во время компиляции, и, таким образом, он становится постоянным ? Если нет, можно ли что-нибудь получить, работая в виде числа и заменив выражение на число?

ответ

7

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

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

+0

Спасибо, это все, что мне нужно. :-) – robsoft

+0

Вы забыли о доступных для записи константах;) В этом случае выражение оценивается во время выполнения –

3

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

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

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

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

2

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

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

+0

+1 для поиска работы 1 shl 30! :-) – robsoft

4

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

const 
    KeyRepeatBit = 30; 
    KeyRepeatMask = 1 shl KeyRepeatBit ; 
+0

Почему не KeyRepeatMask = 1 shl KeyRepeatBit? – RobS

1

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

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

см article on my blog для получения более подробной информации

Смежные вопросы