2013-02-25 15 views
5

यह एमएफसी के सीएमएपी वर्ग में एक डिफ़ॉल्ट हैशकी फ़ंक्शन है।क्यों टाइप कास्टिंग (यूआईएनटी) (शून्य *) (डीडब्ल्यूओआर) की आवश्यकता है?

AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key) 
{ 
  // default identity hash - works for most primitive values 
  return ((UINT)(void*)(DWORD)key) >> 4; 
} 

मेरा प्रश्न क्यों प्रकार कास्टिंग (DWORD) और (शून्य *) की जरूरत है है ?. मुझे लगता है कि (डीडब्ल्यूओआरडी) 16-बिट मशीनों के लिए संगतता मामलों के साथ कुछ संबंध हो सकता है। लेकिन मैं शून्य * के बारे में उलझन में हूं।

+2

नहीं, कोई कारण नहीं। जो भी इस कोड को लिखा है उसे पता नहीं था कि वे क्या कर रहे थे। –

+1

डुन्नो, लेकिन '(शून्य *)' और '(यूआईएनटी)' और '(डीडब्ल्यूओआरडी) 'में से एक बेकार है। –

+0

@ आर .. इस कोड स्निपेट को "एमएफसी के साथ प्रोग्रामिंग विंडोज" से कॉपी किया गया है – duleshi

उत्तर

8
template<class ARG_KEY> 
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key) 
{ 
    // default identity hash - works for most primitive values 
    return (DWORD)(((DWORD_PTR)key)>>4); 
} 

यही वह कार्य है जो आज जैसा दिखता है। आपका संस्करण एमएफसी के पुराने संस्करण से आया है, जो अभी भी 16-बिट प्रोग्राम का समर्थन करने के लिए काफी पुराना है। एमएफसी को पहली बार विंडोज संस्करण 3 के दिनों में रिलीज़ किया गया था। एमएफसी संस्करण 1.0 के माध्यम से 2.5 समर्थित 16-बिट लक्ष्य। फ़ंक्शन का वर्तमान संस्करण 32-बिट और 64-बिट कोड के लिए अच्छा है।

16-बिट कोड में, चयन करने का एक विकल्प मेमोरी मॉडल था। आप सस्ते 16-बिट पॉइंटर्स या महंगे 32-बिट से पॉइंटर्स के पास चुन सकते हैं। इसलिए अतिरिक्त शून्य * कास्ट स्मृति मॉडल आकार के मान को ट्रिम करता है।

2

DWORD पर कास्ट आकार को DWORD तक कम कर देगा।

void* पर कास्ट एक सूचक को आकार कम कर देगा।

इन जानवरों से अनुमानित नहीं किया जा सकता है, और यथार्थवादी वातावरण में यह अधिक है, लेकिन यह अनुकूल है कि अनुकूलन संकलक इन रूपांतरणों के माध्यम से कोई अनावश्यक काम न करें।

+0

लेकिन क्या यह आकार नहीं है (DWORD) == आकार (शून्य *)? तो कास्टिंग सिर्फ कोई समझ नहीं आता है? – duleshi

+1

मशीनों पर एक सूचक का आकार अलग-अलग होता है। 64 बिट मशीन शून्य * 64 बिट है। –

1

DWORD (डबल वर्ड) को कास्टिंग सीपीयू जो वह तुम सिर्फ एक को 4 बार बदलाव इस मामले में शिफ्ट करने के लिए वह केवल DWORD bits.The (void*) कास्टिंग बदलाव है नंबर बनाने की जरूरत है बाइट्स बताने के लिए यहाँ की जरूरत है सूचक (सामान्य पता आकार कास्टिंग)।

शून्य * का आकार है कि आप इस कास्टिंग करना चाहिए की वजह से ओएस (32b प्रणाली या 64b प्रणाली) के बीच अलग अलग हो सकता है।

(UINT) पर अंतिम कास्टिंग सूचकांक को संख्या के रूप में प्राप्त करने के लिए पॉइंटर को हस्ताक्षरित पूर्णांक में डालना है।

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