要想理解好某个库的整个系统,我们需要准确地知道我们当前所阅读的代码位于哪一个库目录中。譬如WTL和ATL的头文件常常容易让初学者混淆。
这里我们要分析两个类,CAtlStringMgr(存在于atlstr.h中)和 CStringData(存在于atlsimpstr.h中)。
首先给出类关系图:(因画图水平有限,下图中CAtlStringMgr到IAtlStringMgr的继承线应该改为实现线)
1、使用到的设计模式
这里我看到一个,是策略模式。细看ATL中,有若干实现IAtlMemMgr接口的类,分别为各个实现类。CAtlStringMgr通过IAtlMemMGr指针来引用,因而可以随意使用各个内存管理类,拥有着良好的扩展性。
2、良好的功能拆分
CAtlStringMgr提供内存管理,CStringData提供共享管理。而更上层的字符串操作,跟这两个类无关,放在别处。(这个以后的文章给出分析)
3、良好的设计理念
类关系图如下,整个结构,所体现出来的设计目的是,提供一个字符串元数据的内存和共享的服务子系统。
4、技术细节
A)CStringData的实现中,把字符内存的管理内容放于起始地址前。(这招其实很老套)
B)所有的CNilStringData引用的都是CAtlStringMgr中的。
5、内存管理和共享管理的关系
搜索整个ATL头文件目录,发现只有一个全局CAtlStringMgr对象,再分析上图涉及的代码,可以发现CAtlStringMgr和CStringData是一对多的关系。所有的CStringData对象都由CAtlStringMgr来分配。
6、进一步分析
其实CAtlStringMgr应该改名为CAtlStringDataMemMgr,它只不是为IAtlMemMgr接口的再包装,提供一个专门为CStringData服务的内存分配器。