此类封装与较高字符串对象(例如CStringT、CSimpleStringT或CFixedStringT对象)关联的信息和数据的各种类型。 每个较高字符串对象包含一个指向其关联CStringData对象的指针,允许多个字符串对象指向同一个字符串数据对象。 这种关系由CStringData对象的引用计数 (nRefs) 表示。
CString支持引用计数。可以通过其成员函数LockBuffe/和UnLockBuffer来禁用/启用引用计数。 对于CString类的成员函数的定义、说明、返回值等形式在此并不赘述,如有此疑问请参阅:http://msdn.microsoft.com/library/en-us/vcmfc98/html/_mfc_cstring_class_members.asp中的相关链接。 常用函数和范例: 改变大小写: CS...
当你使用完数据后,调用UnlockBuffer来将引用计数恢复为1。 #include <afx.h> 请参阅:在“Visual C++ 程序员指南”中的:字符串:基本的CString操作,字符串:CString语义,字符串:CString与C字符串相关的操作,字符串:CString异常清除,字符串:CString参数传递 CString类成员 构造 CString 以各种方法构造一个CString对象 ...
此类封装与较高字符串对象(例如CStringT、CSimpleStringT或CFixedStringT对象)关联的信息和数据的各种类型。 每个较高字符串对象包含一个指向其关联CStringData对象的指针,允许多个字符串对象指向同一个字符串数据对象。 这种关系由CStringData对象的引用计数 (nRefs) 表示。
本文内容 备注 要求 请参见 引用字符串数据对象的计数。 复制 long nRefs; 备注 存储字符串数据对象的引用计数。此计数指示的更高的字符串对象的数量与字符串数据对象。负值表示字符串数据对象当前被锁定。 要求 Header: atlsimpstr.h 请参见 参考 CStringData选件类 CStringData::Lock CStringData::Unlock中...
CString使用写时复制机制,使用了引用计数。 CString提供了Format方法用于格式化 。 习惯_T()宏的使用以符合Unicode。 CString具有GetBuffer()和ReleaseBuffer()。 GetBuffer方法,返回一个可写的缓冲指针。配合使用ReleaseBuffer方法,字符串的实际长度会被重新计算,然后存入 CString 对象中。
MFC的CString是字符串管理类,其为了实现高效率的缓冲管理,使用了引用记数及CopyBeforeWrite技术。这在一定程度上加大了其神秘感和理解难度。好在他的代码是公开的,所以可以给我们研究它的内部实现提供条件。下面就来看看到底是如何实现的。由于不同版本的MSVC其CString实现有些许差别,下面是针对VS2003来说明的。
CopyOnWrite,说白了:就是大家先共享一份数据,可以进行共享只读操作,事情顺利进行;突然有个家伙想修改这份数据里的某一个地方,如果发现这块数据是由多个人共享的,那好,你自己把这份数据复制一份,然后把共享的引用计数减一,然后你自己去玩吧。 CString 也是提供了这样一个 CopyOnWrite 机制的,其中,CSimpleStringT::Fork...
LPTSTR LockBuffer(); //引用计数器=-1,加锁 void UnlockBuffer(); //解锁,引用计数器=1 //比较 int Compare(LPCTSTR lpsz) const; //区分大小写比较 int CompareNoCase(LPCTSTR lpsz) const; //不区分大小写比较 //比较速度没有Compare快 int Collate(LPCTSTR lpsz) const; //区分大小写比较 ...
void FreeExtra(); //深拷贝自己,然后--原来的引用记数器 LPTSTR LockBuffer(); //引用计数器=-1,加锁 void UnlockBuffer(); //解锁,引用计数器=1 //比较 int Compare(LPCTSTR lpsz) const; //区分大小写比较 int CompareNoCase(LPCTSTR lpsz) const; //不区分大小写比较 ...