Delphi常量按位表达式

Delphi常量按位表达式,delphi,optimization,compiler-construction,Delphi,Optimization,Compiler Construction,也许是个愚蠢的问题,但对我来说这只是一个无聊的好奇心 我有一点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; ... 常数 KeyRepeatBit=30; ... //如果设置了LPR

也许是个愚蠢的问题,但对我来说这只是一个无聊的好奇心

我有一点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; ... 常数 KeyRepeatBit=30; ... //如果设置了LPRAM的第30位,则将此消息标记为已处理 如果(Msg.lParam和(1 shl KeyRepeatBit)>0),则 已处理:=真; ... (代码的目的并不重要)


编译器是否将“(1 shl KeyRepeatBit)”视为可在编译时计算的内容,从而使其成为常量?如果不是,将其计算为一个数字并用一个数字替换表达式会有什么好处吗?

是的,编译器在编译时对表达式求值,并将结果值用作常量。用结果值声明另一个常量没有好处


编辑:狐狸是正确的。可赋值类型常量(请参见
{$J+}
编译器指令)不被视为常量,在这种情况下,表达式在运行时进行计算。

它在编译时将其转换为常量

然而,即使没有,这也不会对应用程序的性能产生明显的影响

如果你的应用程序很忙,你可能每秒处理几千条消息。你的旧奔腾我每秒可以做无数次的轮班和数


保持代码可读性,并对其进行分析,以找到瓶颈,然后进行优化-通常通过查看算法,而不是像是否移位这样的低级别。

我怀疑在这里使用数字(顺便说一下,是1073741824)是否真的能提高性能。在这里,您似乎处于某些Windows消息上下文中,这可能会比单个消息增加更多延迟,而且即使在编译时没有优化该数字,也会非常快(无论如何,我认为它是优化的)


我能想象的唯一例外是,这段特定的代码确实经常运行,但正如我所说的,我认为这段代码在编译时得到了优化,因此即使在这种情况下,它也不会有任何区别。

您可以这样确保,仅为了可读性:

const
  KeyRepeatBit = 30;
  KeyRepeatMask = 1 shl KeyRepeatBit ;

也许这与你的问题无关,但我用一个案例记录来描述这类事情,例如:

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

有关更多详细信息,请参见

谢谢,我只需要这些。:-)您忘记了可写常量;)在这种情况下,表达式在运行时求值,为什么KeyRepeatMask=1 shl KeyRepeatBit?