青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

今天和同事說到C++模板會使代碼膨脹, 可同事覺得不會。
同事的依據是: 如果模板會使代碼膨脹, 那么ATL和WTL里為什么還要大量使用模板? 同樣功能 ,ATL和WTL編譯出的可執行文件可比MFC編譯的要小的多。
我當時一愣 ,事實確實如同事所說,難道模板會使代碼膨脹的觀點是錯誤的嗎?

MFC因為本身代碼量和復雜性在那里, 所以它生成比較大的exe無可厚非。我們這里重點關注為什么ATL/WTL使用模板,但是卻不會使生成的exe變大。

我們知道使用模板時, 同一模板生成不同的模板實類后會是多份代碼 ,比如 vector<int>, vector<char>, vector<double>, 這里總共會生成3份不同的vector代碼,這就是我們平時所說的代碼膨脹。

那么為什么ATL/WTL就沒有代碼膨脹的問題呢? 
我這里以 ATL里的窗口代碼為例來分析這個問題,因為我對WinDbg比較熟悉,下面我會以WinDbg為工具來分析我以前的寫得那個俄羅斯方塊程序。

首先我們看一下ATL的窗口代碼:
template <class T, class TBase /* = CWindow */class TWinTraits /* = CControlWinTraits */>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT< TBase, TWinTraits >
{
public:
    DECLARE_WND_CLASS(NULL)

    static LPCTSTR GetWndCaption()
    {
        return NULL;
    }

    HWND Create(HWND hWndParent, _U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
            DWORD dwStyle = 0, DWORD dwExStyle = 0,
            _U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
    {
        if (T::GetWndClassInfo().m_lpszOrigName == NULL)
            T::GetWndClassInfo().m_lpszOrigName = GetWndClassName();
        ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);

        dwStyle = T::GetWndStyle(dwStyle);
        dwExStyle = T::GetWndExStyle(dwExStyle);

        // set caption
        if (szWindowName == NULL)
            szWindowName = T::GetWndCaption();

        return CWindowImplBaseT< TBase, TWinTraits >::Create(hWndParent, rect, szWindowName,
            dwStyle, dwExStyle, MenuOrID, atom, lpCreateParam);
    }
};
上面是一個模板類,它應該會生成多份模板實例代碼:我們可以用WinDbg的符號搜索命令來做驗證:
輸入 x HYTeris!ATL::CWindowImpl<* , 搜索所有以 HYTeris!ATL::CWindowImpl< 開頭的符號
0:000> x HYTeris!ATL::CWindowImpl<*
004592f0 HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
004343a0 HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00437c90 HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
00430440 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> >::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> > (void)
0041c990 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
0044cf50 HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
004539a0 HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00435800 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00434640 HYTeris!ATL::CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
00437440 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> >::GetWndCaption (void)
00436020 HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00453f70 HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
00424e30 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
004338a0 HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
0041c4f0 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00441b50 HYTeris!ATL::CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
004365f0 HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00455120 HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
0040ea20 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00453fa0 HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
0041abc0 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00459c20 HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
0045f640 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
004608a0 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndClassInfo (void)
0045fed0 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00433a70 HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00437c60 HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
0044fb70 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
0041acf0 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00459510 HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
00437a90 HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
00430490 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> >::~CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> > (void)
00424de0 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00433ac0 HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00433850 HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00433b60 HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00452050 HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
0044f8e0 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
0044cec0 HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
004340e0 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00433ef0 HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
004348c0 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::~CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > > (void)
004535b0 HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
00454170 HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
00459c70 HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00451ed0 HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00451f20 HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
0045c4b0 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00436320 HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
004536a0 HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
004604a0 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::GetWndCaption (void)
0040eca0 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
0045ff90 HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
00437cc0 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
004366e0 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
0045e620 HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
004608d0 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndCaption (void)
004520a0 HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
0045d210 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > > (void)
004d84a8 HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d84b8 HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d7970 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d7960 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d914c HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8dd0 HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8b04 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d8b14 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d8ae8 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004e31b8 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004e2980 HYTeris!ATL::CWindowImpl<CTsMainDisplayPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d88c4 HYTeris!ATL::CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8330 HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d88f0 HYTeris!ATL::CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d88e0 HYTeris!ATL::CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d8a40 HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004e30f0 HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d8a5c HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d8a6c HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004e21d0 HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d8c70 HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004e2e78 HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004e1f00 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> > `RTTI Type Descriptor' = <no type information>
004d9208 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d9218 HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004e1ad8 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d834c HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d835c HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d8c9c HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d8c8c HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d856c HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d855c HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004e2bb8 HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d7fa0 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d7fb0 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d91ec HYTeris!ATL::CWindowImpl<CTsSingleControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004e2048 HYTeris!ATL::CWindowImpl<CTsMainButtonPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d8174 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d8184 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> >::`RTTI Base Class Array' = <no type information>
004d8dfc HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d8dec HYTeris!ATL::CWindowImpl<CTsMutiScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004e2728 HYTeris!ATL::CWindowImpl<CTsKeyEdit,WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004e28c8 HYTeris!ATL::CWindowImpl<CTsNextElementContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d8fac HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d8f9c HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d848c HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8f80 HYTeris!ATL::CWindowImpl<CTsButton,WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8158 HYTeris!ATL::CWindowImpl<CTsGameMainWnd,ATL::CWindow,ATL::CWinTraits<114229248,262400> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8540 HYTeris!ATL::CWindowImpl<CTsMainStatusPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d7944 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d7f84 HYTeris!ATL::CWindowImpl<CTsDisplayContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004e2aa0 HYTeris!ATL::CWindowImpl<CTsSingleScoreContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d9168 HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d9178 HYTeris!ATL::CWindowImpl<CTsSubControlContainer,ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004e1628 HYTeris!ATL::CWindowImpl<CTsAgentWindow,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004e2148 HYTeris!ATL::CWindowImpl<CTsMainControlPane,ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d95c4 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Base Class Array' = <no type information>
004d95b4 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Class Hierarchy Descriptor' = <no type information>
004e3400 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > > `RTTI Type Descriptor' = <no type information>
004d9598 HYTeris!ATL::CWindowImpl<CTsUserListCtrl,WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
上面的符號可以驗證我們多份實例的猜想。
可以看到 CWindowImpl和我們的窗口繼承類(T),窗口基類(TBase), 窗口風格(TWinTraits) 相關,所以數量很多 。  那么為什么這么多的符號,也就是這么多的函數代碼 ,exe大小沒有被撐大?
那時因為CWindowImpl類函數本身很小, 我們從函數的 代碼量上就可以看出來。

用同樣的方法 ,我們可以繼續分析 CWindowImplBaseT
template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
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<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, unsigned shortvoid *)
0040ec20 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndStyle (unsigned long)
00435970 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::OnFinalMessage (struct HWND__ *)
004604d0 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::GetWndStyle (unsigned long)
00434a10 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::~CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
0040ec60 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWndExStyle (unsigned long)
00461740 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::WindowProc (struct HWND__ *, unsigned int, unsigned intlong)
0044c040 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::WindowProc (struct HWND__ *, unsigned int, unsigned intlong)
004346e0 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::~CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
0041c440 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00435940 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::GetWindowProc (void)
00459580 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::GetWndExStyle (unsigned long)
00461950 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, unsigned shortvoid *)
004395b0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::StartWindowProc (struct HWND__ *, unsigned int, unsigned intlong)
00439ea0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::DefWindowProcW (unsigned int, unsigned intlong)
00461620 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::StartWindowProc (struct HWND__ *, unsigned int, unsigned intlong)
004596e0 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, unsigned shortvoid *)
0041ced0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::WindowProc (struct HWND__ *, unsigned int, unsigned intlong)
0044c370 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::UnsubclassWindow (int)
00460510 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::GetWndExStyle (unsigned long)
00457f70 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::WindowProc (struct HWND__ *, unsigned int, unsigned intlong)
0045f830 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::GetWindowProc (void)
00457820 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
004374b0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::GetWndExStyle (unsigned long)
00434ad0 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::~CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > > (void)
004595c0 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::StartWindowProc (struct HWND__ *, unsigned int, unsigned intlong)
004358f0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> > (void)
00445920 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::OnFinalMessage (struct HWND__ *)
00461ad0 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::DefWindowProcW (unsigned int, unsigned intlong)
0041c4c0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::OnFinalMessage (struct HWND__ *)
00437470 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::GetWndStyle (unsigned long)
004398e0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::Create (struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, unsigned shortvoid *)
0040ed50 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::StartWindowProc (struct HWND__ *, unsigned int, unsigned intlong)
004458a0 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > (void)
0045f7e0 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > > (void)
0041ad30 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::~CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> > (void)
00430550 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::~CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> > (void)
0045f860 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::OnFinalMessage (struct HWND__ *)
004582a0 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::UnsubclassWindow (int)
0041c490 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::GetWindowProc (void)
0044cb50 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::DefWindowProcW (unsigned int, unsigned intlong)
0044c250 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::SubclassWindow (struct HWND__ *)
004458f0 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::GetWindowProc (void)
00459540 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::GetWndStyle (unsigned long)
00458180 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::SubclassWindow (struct HWND__ *)
00457870 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::GetWindowProc (void)
00457910 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::OnFinalMessage (struct HWND__ *)
0040e990 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::DestroyWindow (void)
004396d0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::WindowProc (struct HWND__ *, unsigned int, unsigned intlong)
0041d1c0 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::DefWindowProcW (unsigned int, unsigned intlong)
004578a0 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::DefWindowProcW (unsigned int, unsigned intlong)
004d8fc8 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8ff4 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d8fe4 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d79b4 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d79a4 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004e2798 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d819c HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d8938 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Array' = <no type information>
004d8928 HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d960c HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Base Class Array' = <no type information>
004d95fc HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Class Hierarchy Descriptor' = <no type information>
004e2ee8 HYTeris!ATL::CWindowImplBaseT<WTL::CButtonT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d81c8 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::`RTTI Base Class Array' = <no type information>
004d81b8 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004e34a0 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > > `RTTI Type Descriptor' = <no type information>
004d95e0 HYTeris!ATL::CWindowImplBaseT<WTL::CListViewCtrlT<ATL::CWindow>,ATL::CWinTraitsOR<32777,0,ATL::CWinTraits<1442840576,0> > >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004e1f68 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<114229248,262400> > `RTTI Type Descriptor' = <no type information>
004e1688 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> > `RTTI Type Descriptor' = <no type information>
004d7988 HYTeris!ATL::CWindowImplBaseT<ATL::CWindow,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d890c HYTeris!ATL::CWindowImplBaseT<WTL::CEditT<ATL::CWindow>,ATL::CWinTraits<1442840576,0> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
可以看到 CWindowImplBaseT只與 窗口基類和窗口風格相關 ,數量 已經減小很多 ,CWindowImplBaseT模板類本身函數數量不多 ,函數代碼量大小也不大 。 

然后再看CWindowImplRoot,
template <class TBase /* = CWindow */>
class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap
{
public:
    CWndProcThunk m_thunk;
    const _ATL_MSG* m_pCurrentMsg;
    DWORD m_dwState;

    enum { WINSTATE_DESTROYED = 0x00000001 };

// Constructor/destructor
    CWindowImplRoot() : m_pCurrentMsg(NULL), m_dwState(0)
    { }

    virtual ~CWindowImplRoot()
    {
#ifdef _DEBUG
        if(m_hWnd != NULL)    // should be cleared in WindowProc
        {
            ATLTRACE(atlTraceWindowing, 0, _T("ERROR - Object deleted before window was destroyed\n"));
            ATLASSERT(FALSE);
        }
#endif //_DEBUG
    }

// Current message
    const _ATL_MSG* GetCurrentMessage() const
    {
        return m_pCurrentMsg;
    }

    // "handled" management for cracked handlers
    BOOL IsMsgHandled() const
    {
        const _ATL_MSG* pMsg = GetCurrentMessage();
        ATLASSERT(pMsg != NULL);
        ATLASSERT(pMsg->cbSize >= sizeof(_ATL_MSG));
        return pMsg->bHandled;
    }
    void SetMsgHandled(BOOL bHandled)
    {
        _ATL_MSG* pMsg = (_ATL_MSG*)GetCurrentMessage();    // override const
        ATLASSERT(pMsg != NULL);
        ATLASSERT(pMsg->cbSize >= sizeof(_ATL_MSG));
        pMsg->bHandled = bHandled;
    }

// Message forwarding and reflection support
    LRESULT ForwardNotifications(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT ReflectNotifications(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    static BOOL DefaultReflectionHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult);
};

0:000> x HYTeris!ATL::CWindowImplRoot*
004364d0 HYTeris!ATL::CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> >::~CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> > (void)
004367d0 HYTeris!ATL::CWindowImplRoot<WTL::CEditT<ATL::CWindow> >::~CWindowImplRoot<WTL::CEditT<ATL::CWindow> > (void)
00457c30 HYTeris!ATL::CWindowImplRoot<WTL::CButtonT<ATL::CWindow> >::CWindowImplRoot<WTL::CButtonT<ATL::CWindow> > (void)
00460550 HYTeris!ATL::CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> >::CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> > (void)
004479d0 HYTeris!ATL::CWindowImplRoot<WTL::CEditT<ATL::CWindow> >::CWindowImplRoot<WTL::CEditT<ATL::CWindow> > (void)
0041c360 HYTeris!ATL::CWindowImplRoot<ATL::CWindow>::~CWindowImplRoot<ATL::CWindow> (void)
00435f40 HYTeris!ATL::CWindowImplRoot<WTL::CButtonT<ATL::CWindow> >::~CWindowImplRoot<WTL::CButtonT<ATL::CWindow> > (void)
004613f0 HYTeris!ATL::CWindowImplRoot<ATL::CWindow>::ForwardNotifications (unsigned int, unsigned intlongint *)
00438f50 HYTeris!ATL::CWindowImplRoot<ATL::CWindow>::ReflectNotifications (unsigned int, unsigned intlongint *)
0041c8e0 HYTeris!ATL::CWindowImplRoot<ATL::CWindow>::CWindowImplRoot<ATL::CWindow> (void)
004e2800 HYTeris!ATL::CWindowImplRoot<WTL::CEditT<ATL::CWindow> > `RTTI Type Descriptor' = <no type information>
004d897c HYTeris!ATL::CWindowImplRoot<WTL::CEditT<ATL::CWindow> >::`RTTI Base Class Array' = <no type information>
004d896c HYTeris!ATL::CWindowImplRoot<WTL::CEditT<ATL::CWindow> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d9640 HYTeris!ATL::CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d9650 HYTeris!ATL::CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> >::`RTTI Base Class Array' = <no type information>
004d8950 HYTeris!ATL::CWindowImplRoot<WTL::CEditT<ATL::CWindow> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d9028 HYTeris!ATL::CWindowImplRoot<WTL::CButtonT<ATL::CWindow> >::`RTTI Class Hierarchy Descriptor' = <no type information>
004d9038 HYTeris!ATL::CWindowImplRoot<WTL::CButtonT<ATL::CWindow> >::`RTTI Base Class Array' = <no type information>
004e16dc HYTeris!ATL::CWindowImplRoot<ATL::CWindow> `RTTI Type Descriptor' = <no type information>
004e3530 HYTeris!ATL::CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> > `RTTI Type Descriptor' = <no type information>
004d9624 HYTeris!ATL::CWindowImplRoot<WTL::CListViewCtrlT<ATL::CWindow> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d79c8 HYTeris!ATL::CWindowImplRoot<ATL::CWindow>::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004e2f58 HYTeris!ATL::CWindowImplRoot<WTL::CButtonT<ATL::CWindow> > `RTTI Type Descriptor' = <no type information>
004d79f4 HYTeris!ATL::CWindowImplRoot<ATL::CWindow>::`RTTI Base Class Array' = <no type information>
004d79e4 HYTeris!ATL::CWindowImplRoot<ATL::CWindow>::`RTTI Class Hierarchy Descriptor' = <no type information>
004d900c HYTeris!ATL::CWindowImplRoot<WTL::CButtonT<ATL::CWindow> >::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
可以看到 CWindowImplRoot只和窗口基類(CWindow)相關 ,所以 相關的符號就更少了。

最后我們再看一下CWindow:
0:000> x HYTeris!ATL::CWindow::*
004e1000 HYTeris!ATL::CWindow::rcDefault = struct tagRECT
00442a20 HYTeris!ATL::CWindow::DestroyWindow (void)
00425730 HYTeris!ATL::CWindow::InvalidateRect (struct tagRECT *, int)
00442340 HYTeris!ATL::CWindow::CenterWindow (struct HWND__ *)
00425850 HYTeris!ATL::CWindow::UpdateWindow (void)
0041c950 HYTeris!ATL::CWindow::CWindow (struct HWND__ *)
004391e0 HYTeris!ATL::CWindow::GetDlgItem (int)
004568a0 HYTeris!ATL::CWindow::SetWindowRgn (struct HRGN__ *, int)
00441d20 HYTeris!ATL::CWindow::GetWindowLongW (int)
00444350 HYTeris!ATL::CWindow::Create (wchar_t *, struct HWND__ *, class ATL::_U_RECT, wchar_t *, unsigned long, unsigned longclass ATL::_U_MENUorID, void *)
004391b0 HYTeris!ATL::CWindow::operator HWND__ * (void)
00459080 HYTeris!ATL::CWindow::EnableWindow (int)
00425140 HYTeris!ATL::CWindow::GetClientRect (struct tagRECT *)
00430c70 HYTeris!ATL::CWindow::SetWindowTextW (wchar_t *)
0040eb30 HYTeris!ATL::CWindow::GetWndClassName (void)
00456770 HYTeris!ATL::CWindow::MoveWindow (intintintintint)
00442ac0 HYTeris!ATL::CWindow::KillTimer (unsigned int)
00455fc0 HYTeris!ATL::CWindow::GetWindowTextW (wchar_t *, int)
0040ba20 HYTeris!ATL::CWindow::IsWindow (void)
00441db0 HYTeris!ATL::CWindow::GetParent (void)
004315b0 HYTeris!ATL::CWindow::SetWindowPos (struct HWND__ *, intintintint, unsigned int)
00456810 HYTeris!ATL::CWindow::GetWindowRect (struct tagRECT *)
00431860 HYTeris!ATL::CWindow::GetStyle (void)
00455250 HYTeris!ATL::CWindow::Invalidate (int)
004318f0 HYTeris!ATL::CWindow::SetCapture (void)
00442cf0 HYTeris!ATL::CWindow::SetTimer (unsigned int, unsigned int, <function> *)
00431980 HYTeris!ATL::CWindow::ModifyStyle (unsigned long, unsigned long, unsigned int)
00443d10 HYTeris!ATL::CWindow::GetDlgItemTextW (int, wchar_t *, int)
0040b980 HYTeris!ATL::CWindow::SendMessageW (unsigned int, unsigned intlong)
00434be0 HYTeris!ATL::CWindow::ShowWindow (int)
004d7a38 HYTeris!ATL::CWindow::`RTTI Base Class Descriptor at (0,-1,0,64)' = <no type information>
004d7a04 HYTeris!ATL::CWindow::`RTTI Base Class Descriptor at (4,-1,0,64)' = <no type information>
004d7a20 HYTeris!ATL::CWindow::`RTTI Class Hierarchy Descriptor' = <no type information>
004d7a30 HYTeris!ATL::CWindow::`RTTI Base Class Array' = <no type information>
我們看到CWindow只有一份 , 并且函數數量相比AtlWin.h減少了很多,因為ATL是以源代碼的方式提供的 ,所有沒有用到的函數不會被編譯到我們最終的可執行文件中 。

通過上面的分析 ,相信我們知道了為什么ATL/WTL大量使用模板,但是生成的exe還是這么小的原因 :
不是模板不會使代碼膨脹,而是ATL/WTL在設計時就關注了這個問題 ,它避免了在可能生成很多模板實例的模板類中編寫大量代碼(有些拗口,不知道你有沒有讀懂^_^)

總結下 ,如果你想用模板,但是又不想 讓自己最終的可執行文件變的很大, 有2種方式:
(1)你的模板類不會生成很多模板實例,這樣寫成模板類還有意義嗎?
(2)你的模板類的代碼量或是函數個數很少,你可以仿照ATL的方式把模板無關的東西用繼承的方式逐層剝離,確保模板類的代碼都是和模板參數相關的。
posted on 2012-11-08 22:37 Richard Wei 閱讀(4070) 評論(2)  編輯 收藏 引用 所屬分類: C++

FeedBack:
# re: C++模板會使代碼膨脹嗎
2012-11-09 00:10 | 溪流
所謂的“膨脹”,你不用模版,還不是都要自己寫出來?  回復  更多評論
  
# re: C++模板會使代碼膨脹嗎
2012-11-09 08:42 | Richard Wei
@溪流
繼承和模板在一定程度上都可以實現代碼重用, 我想我們平時所說的模板使代碼膨脹是相對OO里的繼承而言.  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩视频中文| 午夜精品一区二区三区在线播放 | 久久综合电影| 欧美有码视频| 久久综合九色综合久99| 狼人天天伊人久久| 欧美激情在线有限公司| 欧美日韩国产综合网| 国产精品swag| 一区二区在线观看视频| 午夜久久久久久| 久久久国产视频91| 欧美激情精品久久久久久久变态| 欧美成人乱码一区二区三区| 欧美激情一区在线| 国产精品成人aaaaa网站| 国产一区二区三区免费在线观看| 亚洲激情午夜| 午夜精品短视频| 免费一区视频| 亚洲色诱最新| 久久国产精品电影| 欧美日韩精品欧美日韩精品一| 国产欧美精品一区| 日韩一区二区高清| 久久久久久综合| 日韩一区二区精品| 久久久精彩视频| 国产伦精品一区二区三区| 亚洲国产91| 久久精品国产96久久久香蕉| 亚洲精品久久久久久久久久久久| 一区二区三区福利| 久久精品九九| 国产精品免费视频xxxx| 亚洲精品久久久久久久久久久久久| 欧美在线观看网站| 亚洲伦伦在线| 欧美精品粉嫩高潮一区二区| 一区二区三区在线高清| 欧美一区成人| 亚洲一区尤物| 国产精品黄色| 亚洲欧美日本日韩| 日韩一区二区免费高清| 免费黄网站欧美| 亚洲福利视频二区| 久久人人爽爽爽人久久久| 亚洲欧美日韩国产一区| 国产精品系列在线| 亚洲男女自偷自拍图片另类| 亚洲精品欧美专区| 欧美高清在线一区二区| 亚洲国产精品久久久久秋霞蜜臀| 久久免费观看视频| 欧美亚洲一区在线| 国产午夜精品美女毛片视频| 欧美精品在线一区| 国产精品v欧美精品v日韩| 在线性视频日韩欧美| 亚洲免费观看在线视频| 欧美日韩精品久久久| 亚洲尤物精选| 亚洲一区二区三区精品在线观看| 欧美性片在线观看| 午夜精品偷拍| 欧美一区二区精美| 怡红院精品视频| 亚洲盗摄视频| 欧美日韩中文字幕精品| 亚洲欧美日韩爽爽影院| 欧美一区不卡| 亚洲欧洲综合另类| 亚洲人在线视频| 国产精品色在线| 美国十次成人| 欧美日韩久久精品| 久久精品视频网| 久久尤物电影视频在线观看| 亚洲精品自在久久| 亚洲一区二区三| 亚洲国产成人久久| 日韩亚洲视频在线| 国产伦精品一区二区三区在线观看| 久久精品夜色噜噜亚洲aⅴ| 久久综合网hezyo| 亚洲伊人观看| 久久久久亚洲综合| 在线视频亚洲欧美| 久久久www成人免费无遮挡大片 | 在线视频成人| 亚洲免费久久| 有码中文亚洲精品| 一区二区三区久久| **欧美日韩vr在线| 亚洲综合色丁香婷婷六月图片| 影音国产精品| 亚洲视频精选在线| 亚洲经典一区| 久久精品欧洲| 欧美一区二区三区免费大片| 免费中文日韩| 久久综合中文色婷婷| 欧美日韩专区| 亚洲国产一成人久久精品| 国产日韩精品一区观看| 99精品国产在热久久下载| 亚洲高清在线| 久久国产精品久久w女人spa| 亚洲调教视频在线观看| 久热精品视频在线观看| 久久国产精品久久精品国产| 欧美日韩中文精品| 91久久夜色精品国产九色| 伊人久久婷婷色综合98网| 亚洲一区二区三区精品动漫| 在线视频你懂得一区| 久久视频国产精品免费视频在线| 久久久久久噜噜噜久久久精品| 中国女人久久久| 欧美.www| 欧美大片免费观看| 国产一区欧美日韩| 性欧美大战久久久久久久久| 亚洲欧美乱综合| 欧美午夜宅男影院在线观看| 亚洲国产精品久久91精品| 亚洲高清不卡在线观看| 久久免费国产精品| 久久人人97超碰精品888| 国产视频观看一区| 欧美一级理论片| 久久九九免费| 一区在线观看| 免费日韩视频| 亚洲精品乱码久久久久久蜜桃91| 亚洲精品在线免费观看视频| 欧美高清不卡在线| 亚洲精品在线观看视频| 一区二区三区|亚洲午夜| 欧美午夜激情在线| 亚洲欧美日韩爽爽影院| 久久超碰97人人做人人爱| 国产一区二区三区四区老人| 久久精品99久久香蕉国产色戒| 美女黄毛**国产精品啪啪| 亚洲国产精品激情在线观看| 欧美激情2020午夜免费观看| 亚洲免费av观看| 久久精品国产亚洲aⅴ| 亚洲夫妻自拍| 欧美午夜片在线免费观看| 亚洲免费影院| 免费亚洲一区二区| 亚洲久久一区| 国产精品资源在线观看| 性欧美大战久久久久久久久| 免费人成精品欧美精品| 一区二区三区成人| 国产日韩av一区二区| 免费人成网站在线观看欧美高清| 99热免费精品| 男男成人高潮片免费网站| 一区二区三区四区蜜桃| 国产欧美一区视频| 欧美阿v一级看视频| 亚洲一区二区高清| 欧美国产日韩亚洲一区| 亚洲欧美中日韩| 亚洲人体大胆视频| 国产欧美在线| 欧美日韩一区二区三区在线| 欧美专区日韩专区| 99国产精品久久久久久久成人热| 久久成人综合视频| 亚洲美女黄网| 国产主播喷水一区二区| 欧美日韩国产综合视频在线观看| 欧美在线视频全部完| 亚洲欧洲三级| 噜噜噜久久亚洲精品国产品小说| 中日韩美女免费视频网址在线观看 | 亚洲免费网址| 最新中文字幕亚洲| 久久久久久夜| 99国内精品久久| 亚洲精品国产日韩| 久久久久国产一区二区| 一本色道久久综合亚洲精品婷婷| 久久精品天堂| 亚洲欧美一区二区激情| 亚洲精品自在久久| 亚洲第一搞黄网站| 国产视频亚洲| 国产精品日韩欧美一区二区| 牛夜精品久久久久久久99黑人| 久久成人免费电影| 亚洲在线观看视频| 一本综合精品| 日韩一级精品视频在线观看|