2009-07-22 55 views
6

可能是一个愚蠢的问题,但它对我来说是一种闲置的好奇心。德尔福常数按位表达式

我有一些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)”的东西,可以在编译时计算的,因此它变成一个常数?如果不是,将数字作为数字并用数字替换表达式会有什么好处?

回答

7

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

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

+0

谢谢,这就是我所需要的。 :-) – robsoft 2009-07-22 10:42:59

+0

您忘记了可写常量;)在这种情况下,表达式会在运行时被评估为 – 2009-07-22 12:41:13

3

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

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

如果您的应用程序繁忙,则您可能每秒处理几千条消息。你的旧奔腾我可以做每秒轮换和安士的超声波。

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

2

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

唯一的例外,我能想象将是代码的这件特定的运行真的经常出现的情况,但正如我所说,我认为这个被在编译时进行了优化,所以即使在这种情况下,它不会使根本不同。

+0

+1,因为它会影响工作1 shl 30! :-) – robsoft 2009-07-22 10:44:12

4

您可以确保就像和这个,单独可读性:

const 
    KeyRepeatBit = 30; 
    KeyRepeatMask = 1 shl KeyRepeatBit ; 
1

也许这是offtopic你的问题,但我使用的情况下,记录这几样东西,例如:

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