【问题标题】:Delphi constant bitwise expressionsDelphi 常量位表达式
【发布时间】:2009-07-22 10:28:07
【问题描述】:

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

我有一些看起来像这样的 Delphi 代码;

常量 KeyRepeatBit = 30; ... // 如果设置了 lParam 的第 30 位,则将此消息标记为已处理 如果 (Msg.lParam 和 (1 shl KeyRepeatBit) > 0) 那么 处理:=真; ...

(代码的目的并不重要)

编译器是否将“(1 shl KeyRepeatBit)”视为可以在编译时计算的东西,因此它成为一个常量?如果没有,将其计算为数字并将表达式替换为数字会有什么好处吗?

【问题讨论】:

    标签: delphi optimization compiler-construction


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这就是我所需要的。 :-)
    • 您忘记了可写常量;)在这种情况下,表达式在运行时进行评估
    【解决方案2】:

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

    const
      KeyRepeatBit = 30;
      KeyRepeatMask = 1 shl KeyRepeatBit ;
    

    【讨论】:

    • 为什么不 KeyRepeatMask = 1 shl KeyRepeatBit?
    【解决方案3】:

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

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

    如果您的应用程序繁忙,您每秒可能会处理几千条消息。你的旧 Pentium 我每秒可以做数以万计的轮班和操作。

    让您的代码保持可读性,并对其进行分析以发现瓶颈,然后再进行优化 - 通常是通过查看算法,而不是像您是否正在转移这样低的水平。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        也许这与您的问题无关,但我使用案例记录来处理这类事情,例如:

          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了解更多详情

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-22
          • 1970-01-01
          • 2017-03-30
          • 1970-01-01
          • 1970-01-01
          • 2017-08-20
          • 1970-01-01
          相关资源
          最近更新 更多