代码之家  ›  专栏  ›  技术社区  ›  robsoft

Delphi常量位表达式

  •  6
  • robsoft  · 技术社区  · 17 年前

    可能是个愚蠢的问题,但对我来说这是一种无聊的好奇心。

    我有一些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 keyprepeatbit)”视为可在编译时计算的内容,从而使其成为常量?如果不是,将它作为一个数字计算并用一个数字替换表达式,会有什么收获吗?

    5 回复  |  直到 17 年前
        1
  •  7
  •   Ondrej Kelle    17 年前

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

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

        2
  •  4
  •   Henk Holterman    17 年前

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

    const
      KeyRepeatBit = 30;
      KeyRepeatMask = 1 shl KeyRepeatBit ;
    
        3
  •  3
  •   Will    17 年前

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

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

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

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

        4
  •  2
  •   schnaader    17 年前

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

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

        5
  •  1
  •   Remko    17 年前

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

      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 有关详细信息