2009-07-22 18 views
6

शायद एक बेवकूफ सवाल है, लेकिन यह मेरे लिए एक निष्क्रिय जिज्ञासा है।डेल्फी निरंतर bitwise अभिव्यक्ति

मुझे कुछ ऐसा डेल्फी कोड मिला है जो इस तरह दिखता है;

 
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

+0

आप लिखने योग्य स्थिरांक के बारे में भूल गए;) उस स्थिति में अभिव्यक्ति का मूल्यांकन 1 श्लोक 30 के लिए परेशान करने के लिए रन-टाइम –

3

यह इसे संकलित समय पर निरंतर परिवर्तित करता है।

हालांकि, अगर ऐसा नहीं होता है, तो इसका आपके आवेदन के प्रदर्शन पर कोई ध्यान देने योग्य प्रभाव नहीं होगा।

यदि आपका ऐप व्यस्त है तो आप प्रति सेकंड कुछ हजार संदेश संभाल सकते हैं। आपका पुराना पेंटियम मैं प्रति सेकंड शिफ्ट और एंड्रॉइड कर सकता हूं।

अपने कोड को पठनीय रखें, और इसे तब बाधाओं को ढूंढने के लिए प्रोफ़ाइल करें जिन्हें आप अनुकूलित करते हैं - आम तौर पर एल्गोरिदम को देखकर, और इतना कम स्तर नहीं कि आप स्थानांतरण कर रहे हैं या नहीं।

2

मुझे संदेह है कि एक संख्या का उपयोग (रास्ते में 1073741824 होगा) यहां वास्तव में प्रदर्शन में सुधार होगा। आप यहां कुछ विंडोज़ संदेश संदर्भ में प्रतीत होते हैं और यह संभवतः एकल से अधिक देरी जोड़ देगा और यह संकलन समय पर अनुकूलित नहीं होने पर भी बिजली तेज हो रहा है (वैसे भी, मुझे लगता है कि यह अनुकूलित है)।

एकमात्र अपवाद मैं ऐसा होता है कि कोड के इस विशेष टुकड़ा वास्तव में अक्सर चलाया जाता है होगा कल्पना कर सकता है, लेकिन जैसा कि मैंने कहा कि मैं इस संकलन समय पर अनुकूलित हो जाता है और इसलिए भी इस मामले में यह नहीं होगा लगता है बिल्कुल एक अंतर

+0

+1 पर किया गया है! :-) – robsoft

4

तुम्हें यकीन iike इस अकेले पठनीयता के लिए कर सकते हैं:

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

क्यों KeyRepeatMask = 1 shl KeyRepeatBit नहीं? – RobS

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

संबंधित मुद्दे