Да, компилятор оценивает выражение во время компиляции и использует значение результата как константу. Нет никакого преимущества в объявлении другой константы со значением результата самостоятельно.
EDIT: The_Fox верен. Назначаемые типизированные константы (см. {$ J +}
директиву компилятора) не обрабатываются как константы, и в этом случае выражение вычисляется во время выполнения.
Вы можете убедиться, что вот так, только для удобства чтения:
const
KeyRepeatBit = 30;
KeyRepeatMask = 1 shl KeyRepeatBit ;
Он преобразует его в константу во время компиляции.
Однако, даже если бы это было не так, это не оказало бы заметного влияния на производительность вашего приложения.
Вы можете обработать несколько тысяч сообщений в секунду, если ваше приложение занято. Ваш старый Pentium I может делать миллиарды сдвигов и операций в секунду.
Сохраняйте свой код читабельным и профилируйте его, чтобы находить узкие места, которые вы затем оптимизируете - обычно глядя на алгоритм, а не на такой низкий уровень, как вы? переключается или нет.
Я сомневаюсь что использование числа (кстати, 1073741824) действительно улучшит производительность. Кажется, вы попадаете в какой-то контекст сообщения Windows, и это, возможно, добавит больше задержки, чем одно, и это молниеносно, даже если число не оптимизировано во время компиляции (в любом случае, я думаю, что это оптимизировано).
Единственное исключение, которое я мог представить, будет в том случае, если этот конкретный фрагмент кода запускается действительно часто, но, как я уже сказал, я думаю, что это оптимизируется во время компиляции, и поэтому даже в этом случае это не будет иметь значения вообще.
Возможно, ваш вопрос не по теме, но я использую запись случая для подобных вещей, например:
TlParamRecord = record
case Integer of
0: (
RepeatCount: Word;
ScanCode: Byte;
Flags: Set of (lpfExtended, lpfReserved=4, lpfContextCode,
lpfPreviousKeyState, lpfTransitionState);
);
1: (lParam: LPARAM);
end;
см. статья в моем блоге для получения дополнительных сведений