剖析 ATL CStringData

要想理解好某个库的整个系统,我们需要准确地知道我们当前所阅读的代码位于哪一个库目录中。譬如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服务的内存分配器。







原文地址:https://www.cnblogs.com/tekkaman/p/2020117.html