日期:2010-04-01  浏览次数:21017 次


    大量的程序员都尽可能多地利用现有的代码。程序员经常购买那些包装成库的代码,而且许多成功的公司正是靠生产真正优秀的代码库而发展起来的,例如Rogue WaveSoftware (www.roguewave.com)。
    当C语言流行时,代码库就是函数库。例如,可以购买一个数学库,该库含有完成微积分和代数运算的函数。通常,可以在程序代码中使用一个包含文件来指定一个函数库,可以静态或动态地链接这个函数库。
    静态链接意味者库代码直接集成到程序中。在这种情况下,程序不依赖于其他文件,但文件的大小可能很大。动态链接意味着程序有库的版本信息,其代码存放于一个单独的文件中,这个文件称为动态链接库(DLL)。只有程序运行期间调用DLL中的函数时,才加载DLL到内存。DLL作为一个独立的实体存在于内存中,可以同时被多个程序访问。
    出现C++后,函数库转变为类库。两者的区别在于函数库只包含一系列函数,而类库是用面向对象编程的原理设计的,例如,可以为数据结构做一个类库,该库包括一个链接列表的类。如果使用一个函数库代替,那么链接列表会独立于操作它的函数。另一方面,使用类库时,链接列表和操作它的函数存在于同一个文件的同一个类中。然而,正如使用函数库一样,使用类库涉及到包含文件和链接一个静态库。
    最近,已经从类库发展到模板库。其原因是C++编译器现在已经能够处理C++模板。模板库提供了一系列优于类库的优点。要使用模板库,只要在程序中加入包含文件即可,不用链接到库,因为所有的库代码已经包含在该包含文件中了。
    这听起来不是非常高效,早期确实如此,因为每个包含有模板文件的文件都要得到一个单独的代码拷贝。因此,编译后的程序会很大。但是,为了适应模板,编译器已经优化,使得这种方法非常高效。
    VC有三个供开发者使用的库:一个类库(MFC),二个模板库(ATL和STL)。
17.2.1 微软基础类库
    微软基础类库(MFC)是微软为帮助C++开发者而建立的类库,含有支持各种不同功能的许多类,包括实现复杂的数据结构、操作Windows和访问数据库等。但是,是否应在服务器组件中使用MFC?回答是否定的!
    这很明智的,不要在服务器组件中使用MFC,服务器组件不能访问Win 3.2,所以不需要MFC库,数据库支持最好用ATL实现。
    ATL支持ADO和OLE DB,而MFC不支持。STL与MFC相比有更好的数据结构支持。即使最常用的MFC类,如CString,在标准C库中也有等价的类。偶尔会使用MFC类,如CSocket,但它也可被一种Win 32 API代替。
    MFC是用来建立单独Windows应用程序的,不是用于轻量的COM组件。只有在与现有的使用MFC的代码接口时应使用MFC类。其他情况使用ATL和STL类,这样可以使组件更小且运行得更快。
17.2.2 活动模板库
    你可以判断出活动模板库(ATL)比MFC新,因为ATL中有“Active”这个词,另一种叫法是“微软模板库”(Microsoft Templete Library,MTL)。
    ATL用来快速、简易地创建COM组件,而且只占用较少的内存,组件的关键部分是由C++模板完成的。实际上,ATL的设计在模板的使用上沿用了STL。
    C++模板提供一种类型安全的方法来实现一般的接口。很幸运,微软提供了一些产生ATL代码的向导,所以在建立简单组件时,不必了解模板,甚至不用知道ActiveX的所有细节。ATL另一个优点是不依靠DLL,就是说在装载应用程序时,不必装载DLL和静态地链接,这两项会增加对内存空间的需求。
    ATL使COM的开发更加容易,ATL同样支持通过OLE DB消费者和提供者的数据访问,还有一些特殊的用途,如支持建立微软管理控制台(MMC)插件组件。
    与ATL比较,MFC依赖于额外的运行期DLL或静态链接,所以产生了比ATL大而慢的代码。因此,在建立COM组件时,如果没有用户界面,那么选择ATL比MFC好。
17.2.3 标准模板库
    标准模板库(STL)对于VC++编程员来说是使用得最不充分的有用工具之一,但它是唯一一个标准的和跨平台的VC++库。
    使用STL不多的原因之一是,微软的STL文献难以理解。现在没有为VC++程序员而编写的STL书藉,由Musser和Sauni编写的《STL Tutorial and Reference Guide》是一本关于STL的好书。
    STL对C++组件开发很有用,原因是包含了许多数据结构和算法。很多情况下,服务器组件的用途就是处理数据,STL非常合适这一用途。
    微软最初实现STL标准是在VC++ 4.2中,但是,这个STL实现做得很差,以致不能使用。一些人通过使用HP或SGI提供的STL实现解决这个问题。既然STL是一种ISO/ANSI标准,它就是跨平台的,只要编译器支持STL所要求的结构就可以。然而,微软更新的STL实现(在VC++ 5.0和6.0中的提供),比以前的STL更稳定、更容易使用。
    STL是对ATL的完美补充,ATL没有数据结构和算法。而且,STL和ATL有相似的实现方法,即使用C++模板,所以配合得很好,而且两者都不需要链接额外的动态或静态链接库,这样就会使组件更小,使它们对DLL的依赖更小。
    下面让我们对STL的关键概念做些介绍,在建立服务器组件时要用到这些概念。
    1. STL遍历器
    使用C编程时,一般使用两种方法来遍历数据结构:使用一个下标或递增一个指针,这两种方法达到相同的效果。但是编写一个通用的算法来处理不同的类型是不可能的,用STL遍历器能解决这个问题,下面的例子是最好的说明。
    下面的程序展示了两种标准C的遍历方法,最后是STL的遍历方法。该程序的任务是计算一个字符串中“t”的个数。


    使用遍历器解决了使用指针或下标时出现的问题。指针和下标依赖于数据,这些数据在内存中相邻存放,而遍历器隐藏数据,使数据结构的使用者不必了解数据存储的顺序。隐藏数据结构允许创建通用的算法,这种算法能够与各种数据结构一起工作,例如与容器一起工
作。
    为了算法的效率,STL定义了五种遍历器的类:输入、输出、前向、双向和随机访问。算法针对特定的遍历方法设计,因此具有最优的性能。
    遍历器相似于指针,移动到下一条目和前一条目分别使用操作符“ + +”和“ - -”,同样,获得一个条目的值使用操作符“ *”。
    2. STL映射
    一个映射就是一个排好序的容器,这里关心的是能够根据存储在条目中的键以尽可能快的速度检索条目,而不是关心使条目以线性的顺序存储在容器中。
    STL排序容器有set、multise