2009-07-22 11 views
6

Probabilmente una domanda stupida, ma è una curiosità oziosa per me.Delphi costante espressioni bitwise

Ho un po 'di codice Delphi simile a questo;

 
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; 
... 

(lo scopo del codice non è veramente importante)

fa il compilatore a vedere "(1 SHL KeyRepeatBit)" come qualcosa che può essere calcolata al momento della compilazione, e quindi diventa una costante ? In caso contrario, ci sarebbe qualcosa da guadagnare lavorando come numero e sostituendo l'espressione con un numero?

risposta

7

Sì, il compilatore valuta l'espressione in fase di compilazione e utilizza il valore risultato come costante. Non c'è alcun guadagno nel dichiarare un'altra costante con il valore del risultato.

MODIFICA: The_Fox è corretto. Le costanti digitabili assegnabili (vedere la direttiva del compilatore {$J+}) non vengono trattate come costanti e l'espressione viene valutata in fase di esecuzione in quel caso.

+0

Grazie, è tutto ciò di cui avevo bisogno. :-) – robsoft

+0

Hai dimenticato le costanti scrivibili;) In questo caso l'espressione viene valutata in fase di esecuzione –

3

Lo converte in una costante al momento della compilazione.

Tuttavia, anche se così non fosse, ciò non avrebbe alcun impatto notevole sulle prestazioni dell'applicazione.

È possibile gestire alcune migliaia di messaggi al secondo se l'app è occupata. Il tuo vecchio Pentium I può fare gazillions di turni e ands al secondo.

Mantieni leggibile il tuo codice e analizzalo per trovare i colli di bottiglia che poi ottimizzi, solitamente osservando l'algoritmo e non a un livello così basso come se tu stia spostando o meno.

2

Dubito che l'utilizzo di un numero (sarebbe 1073741824, tra l'altro) qui migliorerebbe davvero le prestazioni. Sembra che tu sia in qualche contesto di messaggi di Windows qui e questo consentirà di aggiungere più delay di un singolo e che è lampo veloce anche se il numero non è ottimizzato al momento della compilazione (comunque, penso che sia ottimizzato).

L'unica eccezione potevo immaginare sarebbe il caso che questo particolare pezzo di codice viene eseguito davvero spesso, ma come ho detto credo che questo viene ottimizzato al momento della compilazione e così anche in questo caso non farà una differenza.

+0

+1 per preoccuparsi di calcolare 1 shl 30! :-) – robsoft

4

È possibile fare in modo Iike questo, solo per la leggibilità:

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

Perché non KeyRepeatMask = 1 shl KeyRepeatBit? – RobS

1

Forse è offtopic alla tua domanda, ma io uso una casistica per questo tipo di cose, ad esempio:

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

vedere article on my blog per ulteriori dettagli