• 剖析 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服务的内存分配器。







  • 相关阅读:
    (总结)MySQL my.cnf参数配置优化详解
    CentOS下安装使用流量监控工具iftop
    ssh登录亚马逊aws
    linux nat squid ntop
    jquery动态添加Div
    为什么st2 chrome无法显示api中的例子
    使用jquery当页面打开时,将修改样式的点击事件绑定到Dom
    jquery动态添加Div
    使用jquery当页面打开时,将修改样式的点击事件绑定到Dom
    sencha touch 2 mvc调用文件顺序
  • 原文地址:https://www.cnblogs.com/tekkaman/p/2020117.html
Copyright © 2020-2023  润新知