C++模板会使代码膨胀吗(四)

2014-11-24 09:13:57 · 作者: · 浏览: 6
t (0,-1,0,64)' =
004d8158 HYTeris!ATL::CWindowImpl >::`RTTI Base Class Descriptor at (0,-1,0,64)' =
004d8540 HYTeris!ATL::CWindowImpl >::`RTTI Base Class Descriptor at (0,-1,0,64)' =
004d7944 HYTeris!ATL::CWindowImpl >::`RTTI Base Class Descriptor at (0,-1,0,64)' =
004d7f84 HYTeris!ATL::CWindowImpl >::`RTTI Base Class Descriptor at (0,-1,0,64)' =
004e2aa0 HYTeris!ATL::CWindowImpl > `RTTI Type Descriptor' =
004d9168 HYTeris!ATL::CWindowImpl >::`RTTI Class Hierarchy Descriptor' =
004d9178 HYTeris!ATL::CWindowImpl >::`RTTI Base Class Array' =
004e1628 HYTeris!ATL::CWindowImpl > `RTTI Type Descriptor' =
004e2148 HYTeris!ATL::CWindowImpl > `RTTI Type Descriptor' =
004d95c4 HYTeris!ATL::CWindowImpl,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Base Class Array' =
004d95b4 HYTeris!ATL::CWindowImpl,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Class Hierarchy Descriptor' =
004e3400 HYTeris!ATL::CWindowImpl,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > > `RTTI Type Descriptor' =
004d9598 HYTeris!ATL::CWindowImpl,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Base Class Descriptor at (0,-1,0,64)' =
上面的符号可以验证我们多份实例的猜想。
可以看到 CWindowImpl和我们的窗口继承类(T),窗口基类(TBase), 窗口风格(TWinTraits) 相关,所以数量很多 。 那么为什么这么多的符号,也就是这么多的函数代码 ,exe大小没有被撑大?
那时因为CWindowImpl类函数本身很小, 我们从函数的 代码量上就可以看出来。

用同样的方法 ,我们可以继续分析 CWindowImplBaseT
template
class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >
{
public:
WNDPROC m_pfnSuperWindowProc;

CWindowImplBaseT() : m_pfnSuperWindowProc(::DefWindowProc)
{}

static DWORD GetWndStyle(DWORD dwStyle)
{
return TWinTraits::GetWndStyle(dwStyle);
}
static DWORD GetWndExStyle(DWORD dwExStyle)
{
return TWinTraits::GetWndExStyle(dwExStyle);
}

virtual WNDPROC GetWindowProc()
{
return WindowProc;
}
static LRESULT CALLBACK StartWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HWND Create(HWND hWndParent, _U_RECT rect, LPCTSTR szWindowName,
DWORD dwStyle, DWORD dwExStyle, _U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam = NULL);
BOOL DestroyWindow()
{
ATLASSERT(::IsWindow(m_hWnd));
return ::DestroyWindow(m_hWnd);
}
BOOL SubclassWindow(HWND hWnd);
HWND UnsubclassWindow(BOOL bForce = FALSE);

LRESULT DefWindowProc()
{
const _ATL_MSG* pMsg = m_pCurrentMsg;
LRESULT lRes = 0;
if (pMsg != NULL)
lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam);
return lRes;
}

LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
#ifdef STRICT
return ::CallWindowProc(m_pfnSuperWindowProc, m_hWnd, uMsg, wParam, lParam);
#else
return ::CallWindowProc((FARPROC)m_pfnSuperWindowProc, m_hWnd, uMsg, wParam, lParam);
#endif
}

virtual void OnFinalMessage(HWND /*hWnd*/)
{
// override to do something, if needed
}
};

0:000> x HYTeris!ATL::CWindowImplBaseT<*
0040f170 HYTeris!ATL::CWindowImplBaseT >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned long, class ATL::_U_MENUorID, unsigned short, void *)
0040ec20 HYTeris!ATL::CWindowImplBaseT >::GetWndStyle (unsigned long)
00435970 HYTeris!ATL::CWindowImplBaseT >::OnFinalMessage (struct HWND__ *)
004604d0 HYTeris!ATL::CWindowImplBaseT,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::GetWndStyle (unsigned lo