欢迎来到天天文库
浏览记录
ID:39619994
大小:40.00 KB
页数:5页
时间:2019-07-07
《深入解析CString的内存结构》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、深入解析MFC--CString的内存结构VC6的时候记得看过CString的源代码,并不复杂,应该是从VC7开始,MFC和ATL共用一个CString了,新的CString使用了模板技术和其它技术,值得一提。 先 看CString的定义:typedefCAtlStringCString;如果想明确使用ANSI和UNICODE版本,可以使用CStringA和CStringW,看它们的定义:typedefCAtlStringWCStringW;typedefCAtlStringACSt
2、ringA;以上三个Atl版本的String,其定义为:typedefCStringT>CAtlStringW;typedefCStringT>CAtlStringA;typedefCStringT>CAtlString;因此,CStringT才是真实的CString类。template3、raits>classCStringT: publicCSimpleStringT::c_bIsMFCDLLTraits>{};CStringT有两个模板参数,第一个表明字符类型,第二个参数从源代码中知道是StrTraitATL:template4、eType>>classStrTraitATL:publicStringIterator{public: staticHINSTANCEFindStringResourceInstance(__inUINTnID)throw() { return(AtlFindStringResourceInstance(nID)); } staticIAtlStringMgr*GetDefaultManager()throw() { return(&g_strmgr)5、; }};从类声明看到他提供了一个字符串管理器,字符迭代器和从资源中获得字符串的功能。字符串管理器比较重要,后面会提到。CStringT没有成员变量,封装了很多好用的字符串函数,数据在基类CSimpleStringT中。CSimpleStringT只有一个成员变量m_pszData,不要小看这个变量,在它身上,有着很多秘密,绝对不是他的声明那么朴实:PXSTRm_pszData;PXSTR就是char或者wchar_t,只不过被模板的特化技术封装了一下。CSimpleStringT没有直接操作6、m_pszData,而是通过成员函数GetData来获得,看一下这个函数:CStringData*GetData()constthrow(){ return(reinterpret_cast(m_pszData)-1);}这个函数将m_pszData指向的内存转成CStringData类型,然后往前移动sizeof(CStringData)的长度,指向了一个CStringData对象。m_pszData的秘密就在此处,实际上,每次分配内存时,都会多分配一段sizeo7、f(CStringData)长度的内存,最前面这段数据格式化为CStringData对象,然后m_pszData指向其后的数据,这才是字符串。8、_______________9、___________________________________________________10、CStringData m_pszData再看CStringData的声明:structCStringData{ IAtlStringMgr*pStringMgr; //StringmanagerforthisC11、StringData intnDataLength; //LengthofcurrentlyuseddatainXCHARs(notincludingterminatingnull) intnAllocLength; //LengthofallocateddatainXCHARs(notincludingterminatingnull) longnRefs; //Referencecount:negative==locked //XCHARdata[nAllo
3、raits>classCStringT: publicCSimpleStringT::c_bIsMFCDLLTraits>{};CStringT有两个模板参数,第一个表明字符类型,第二个参数从源代码中知道是StrTraitATL:template4、eType>>classStrTraitATL:publicStringIterator{public: staticHINSTANCEFindStringResourceInstance(__inUINTnID)throw() { return(AtlFindStringResourceInstance(nID)); } staticIAtlStringMgr*GetDefaultManager()throw() { return(&g_strmgr)5、; }};从类声明看到他提供了一个字符串管理器,字符迭代器和从资源中获得字符串的功能。字符串管理器比较重要,后面会提到。CStringT没有成员变量,封装了很多好用的字符串函数,数据在基类CSimpleStringT中。CSimpleStringT只有一个成员变量m_pszData,不要小看这个变量,在它身上,有着很多秘密,绝对不是他的声明那么朴实:PXSTRm_pszData;PXSTR就是char或者wchar_t,只不过被模板的特化技术封装了一下。CSimpleStringT没有直接操作6、m_pszData,而是通过成员函数GetData来获得,看一下这个函数:CStringData*GetData()constthrow(){ return(reinterpret_cast(m_pszData)-1);}这个函数将m_pszData指向的内存转成CStringData类型,然后往前移动sizeof(CStringData)的长度,指向了一个CStringData对象。m_pszData的秘密就在此处,实际上,每次分配内存时,都会多分配一段sizeo7、f(CStringData)长度的内存,最前面这段数据格式化为CStringData对象,然后m_pszData指向其后的数据,这才是字符串。8、_______________9、___________________________________________________10、CStringData m_pszData再看CStringData的声明:structCStringData{ IAtlStringMgr*pStringMgr; //StringmanagerforthisC11、StringData intnDataLength; //LengthofcurrentlyuseddatainXCHARs(notincludingterminatingnull) intnAllocLength; //LengthofallocateddatainXCHARs(notincludingterminatingnull) longnRefs; //Referencecount:negative==locked //XCHARdata[nAllo
4、eType>>classStrTraitATL:publicStringIterator{public: staticHINSTANCEFindStringResourceInstance(__inUINTnID)throw() { return(AtlFindStringResourceInstance(nID)); } staticIAtlStringMgr*GetDefaultManager()throw() { return(&g_strmgr)
5、; }};从类声明看到他提供了一个字符串管理器,字符迭代器和从资源中获得字符串的功能。字符串管理器比较重要,后面会提到。CStringT没有成员变量,封装了很多好用的字符串函数,数据在基类CSimpleStringT中。CSimpleStringT只有一个成员变量m_pszData,不要小看这个变量,在它身上,有着很多秘密,绝对不是他的声明那么朴实:PXSTRm_pszData;PXSTR就是char或者wchar_t,只不过被模板的特化技术封装了一下。CSimpleStringT没有直接操作
6、m_pszData,而是通过成员函数GetData来获得,看一下这个函数:CStringData*GetData()constthrow(){ return(reinterpret_cast(m_pszData)-1);}这个函数将m_pszData指向的内存转成CStringData类型,然后往前移动sizeof(CStringData)的长度,指向了一个CStringData对象。m_pszData的秘密就在此处,实际上,每次分配内存时,都会多分配一段sizeo
7、f(CStringData)长度的内存,最前面这段数据格式化为CStringData对象,然后m_pszData指向其后的数据,这才是字符串。
8、_______________
9、___________________________________________________
10、CStringData m_pszData再看CStringData的声明:structCStringData{ IAtlStringMgr*pStringMgr; //StringmanagerforthisC
11、StringData intnDataLength; //LengthofcurrentlyuseddatainXCHARs(notincludingterminatingnull) intnAllocLength; //LengthofallocateddatainXCHARs(notincludingterminatingnull) longnRefs; //Referencecount:negative==locked //XCHARdata[nAllo
此文档下载收益归作者所有