2009-07-22 7 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

はい、コンパイラはコンパイル時に式を評価し、結果値を定数として使用します。結果値で別の定数を宣言することはできません。

EDIT:The_Foxは正しいです。割り当て可能な型付き定数({$J+}コンパイラ指令を参照)は定数として扱われず、この場合、式は実行時に評価されます。

+0

ありがとうございました。 :-) – robsoft

+0

書き込み可能な定数について忘れてしまった;)その場合、式は実行時に –

3

コンパイル時に定数に変換されます。

ただし、そうでない場合でも、アプリケーションのパフォーマンスに顕著な影響はありません。

アプリがビジー状態の場合は、1秒あたり数千件のメッセージを処理することがあります。あなたの古いペンティアムは、1秒あたりのシフトと秒のガジリオを行うことができます。

コードを読みやすくして、最適化するボトルネックを見つけるためにプロファイリングしてください。通常はアルゴリズムを見て、シフトしているかどうかといった低レベルではありません。

2

数字を使用すると(実際には1073741824となります)、実際にはパフォーマンスが向上するとは思えません。あなたはいくつかのWindowsのメッセージコンテキストのように見えますが、これは単一のものよりも遅延を追加する可能性があり、数値がコンパイル時に最適化されていなくても高速です(とにかく、最適化されていると思います)。

私が想像することができる唯一の例外は、コードの特定の部分が実際にで実行される場合ですが、私が言ったように、これはコンパイル時に最適化されていると思うので、違いは

+0

+1で評価され、1つのshl 30を解決するために気になります! :-) – robsoft

4

あなたは一人で読みやすくするために、この確認iike、作ることができます。

TlParamRecord = record 
    case Integer of 
     0: (
     RepeatCount: Word; 
     ScanCode: Byte; 
     Flags: Set of (lpfExtended, lpfReserved=4, lpfContextCode, 
      lpfPreviousKeyState, lpfTransitionState); 
    ); 
     1: (lParam: LPARAM); 
    end; 

は、以下を参照してください

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

なぜKeyRepeatMask = 1 shl KeyRepeatBit? – RobS

1

たぶん、たとえばそれは、あなたの質問にofftopicだが、私は物事のこれらの種類のケースレコードを使用しますarticle on my blog詳細は