MFC消息cach算法

 // from ../Microsoft Visual Studio 8/VC/atlmfc/src/mfc/wincore.cpp ///////////////////////////////////////////////////////////////////////////// // Cache of most recently sent messages #ifndef iHashMax // iHashMax must be a power of two #define iHashMax 512 #endif struct AFX_MSG_CACHE { UINT nMsg; const AFX_MSGMAP_ENTRY* lpEntry; const AFX_MSGMAP* pMessageMap; }; AFX_MSG_CACHE _afxMsgCache[iHashMax]; void AFXAPI AfxResetMsgCache() { memset(_afxMsgCache, 0, sizeof(_afxMsgCache)); } /////////////////////////////////////////////////////////////////////////// BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) { ...... const AFX_MSGMAP* pMessageMap; pMessageMap = GetMessageMap(); UINT iHash; iHash = (LOWORD((DWORD_PTR)pMessageMap) ^ message) & (iHashMax-1);//就是这个hash算法 winMsgLock.Lock(CRIT_WINMSGCACHE); AFX_MSG_CACHE* pMsgCache; pMsgCache = &_afxMsgCache[iHash]; const AFX_MSGMAP_ENTRY* lpEntry; if (message == pMsgCache->nMsg && pMessageMap == pMsgCache->pMessageMap) { // cache hit lpEntry = pMsgCache->lpEntry; winMsgLock.Unlock(); if (lpEntry == NULL) return FALSE; // cache hit, and it needs to be handled if (message < 0xC000) goto LDispatch; else goto LDispatchRegistered; } else { // not in cache, look for it pMsgCache->nMsg = message; pMsgCache->pMessageMap = pMessageMap; for (/* pMessageMap already init'ed */; pMessageMap->pfnGetBaseMap != NULL; pMessageMap = (*pMessageMap->pfnGetBaseMap)()) { // Note: catch not so common but fatal mistake!! // BEGIN_MESSAGE_MAP(CMyWnd, CMyWnd) ASSERT(pMessageMap != (*pMessageMap->pfnGetBaseMap)()); if (message < 0xC000) { // constant window message if ((lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries, message, 0, 0)) != NULL) { pMsgCache->lpEntry = lpEntry; winMsgLock.Unlock(); goto LDispatch; } } .... /////////// 抓了几个消息,查看其hash效率, message pMessageMap //hash code 36 + pMessageMap 0x00422c30 messageMap {pfnGetBaseMap=0x004119ab lpEntries=0x00422be8 } const AFX_MSGMAP * //20 129 + pMessageMap 0x00422c30 messageMap {pfnGetBaseMap=0x004119ab lpEntries=0x00422be8 } const AFX_MSGMAP * //177 131 + pMessageMap 0x00422c30 messageMap {pfnGetBaseMap=0x004119ab lpEntries=0x00422be8 } const AFX_MSGMAP * //179 1 + pMessageMap 0x00422c30 messageMap {pfnGetBaseMap=0x004119ab lpEntries=0x00422be8 } const AFX_MSGMAP * //49 129 + pMessageMap 0x00422a1c messageMap {pfnGetBaseMap=0x00411456 lpEntries=0x004229ec } const AFX_MSGMAP * //157 1056+ pMessageMap 0x782e8794 messageMap {pfnGetBaseMap=0x78374670 lpEntries=0x782e87a0 } const AFX_MSGMAP * //436 1109+ pMessageMap 0x782e8794 messageMap {pfnGetBaseMap=0x78374670 lpEntries=0x782e87a0 } const AFX_MSGMAP * //449 1108+ pMessageMap 0x782e8794 messageMap {pfnGetBaseMap=0x78374670 lpEntries=0x782e87a0 } const AFX_MSGMAP * //448 124+ pMessageMap 0x782e8794 messageMap {pfnGetBaseMap=0x78374670 lpEntries=0x782e87a0 } const AFX_MSGMAP * //488 ... 868+ pMessageMap 0x782e8ea4 messageMap {pfnGetBaseMap=0x78374670 lpEntries=0x782e8eb0 } const AFX_MSGMAP * //448 //终于发现冲突的hash key 0x782e8ea4 868 010100100^ 101100100= 111000000=448 0x782e8794 1108 110010100^ 001010100= 111000000=448

你可能感兴趣的:(c,算法,cache,null,mfc)