Delphi常量按位表达式
也许是个愚蠢的问题,但对我来说这只是一个无聊的好奇心 我有一点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),则 已处理:=真; ... (代码的目的并不重要)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
编译器是否将“(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?