Delphi常量按位表达式

时间:2009-07-22 10:28:08

标签: 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;
...

(代码的目的并不重要)

编译器是否将“(1 shl KeyRepeatBit)”视为可以在编译时计算的内容,因此它变为常量?如果没有,那么通过将其作为数字进行处理并用数字替换表达式会有什么好处吗?

5 个答案:

答案 0 :(得分:7)

是的,编译器在编译时计算表达式,并将结果值用作常量。用自己的结果值声明另一个常量是没有收获的。

编辑:The_Fox是正确的。可分配的类型常量(请参阅{$J+}编译器指令)不会被视为常量,并且在这种情况下会在运行时计算表达式。

答案 1 :(得分:4)

为了便于阅读,你可以确定这一点:

const
  KeyRepeatBit = 30;
  KeyRepeatMask = 1 shl KeyRepeatBit ;

答案 2 :(得分:3)

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

但是,即使它没有,这也不会对您的应用程序的性能产生明显影响。

如果您的应用程序繁忙,您可能每秒处理几千封邮件。你的旧奔腾我可以做到每秒轮班次数和数量。

保持您的代码可读性,并对其进行分析以找出您随后优化的瓶颈 - 通常是通过查看算法,而不是像您是否正在转移那样低级别。

答案 3 :(得分:2)

我怀疑使用数字(顺便说一句是1073741824)这样可以真正提高性能。你似乎在这里的某些Windows消息上下文中,这可能会增加比单个更多的延迟,即使数字未在编译时优化(无论如何,我认为它已经过优化),这也是闪电般快速。

我能想到的唯一例外是,这段特殊的代码经常 运行,但正如我所说,我认为这在编译时得到优化,所以即使在这种情况下它也是如此根本不会有所作为。

答案 4 :(得分: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