改进C++程序的重剑stl库和战斧boost库

来源:互联网 发布:最全的电影数据库 编辑:程序博客网 时间:2024/04/28 10:36

 

改进C++程序的重剑stl库和战斧boost

 

                             Darren

 

 

 

 

 

c++编程的编程过程式相对比较底层的,涉及到内存的动态创建和释放、和计算机内部物理硬件运行业是紧密结合的。但是,这样的编程模式下,假如构建更为庞大的系统工程,如分布式系统时,保持系统的稳定性比较困难,哪怕是一个指针的内存没有释放都可以导致整个系统crush。所以一般大型系统开发多数使用javac#等更高层的语言以及框架进行开发。因为这样有一个稳定的框架不会导致系统崩溃。

C++也有自己的一套函数库可以实现更加稳定的框架设计。Stlboost库都是可复用的编程函数库,服务于进行稳定的参数化框架设计和实现。复杂程序的设计编写工作展开时候,需要拥有更高效率的库函数提供参数化模版的支持。c#java的强大之处除了拥有较为强大的虚拟机模式的编译模式,就是还有比较强大的库函数支持。C++stlboost也就是充当同样角色的库函数库。

Stl已经是一种应用面比较广的重型函数库,编程人员会觉得这个武器好比战场上战士的重剑,出击有力,应用相对简单。Boost库则提供更加深入的程序支持。有的时候,编程人员会觉得这个库比stl更加深入和有力,那么boost就犹如一把巨型的战斧,虽然笨重一些,但是更加有力。两种函数库的结合是很紧密的,甚至在仔细研究boost库改进程序实现的时候你会看到很多stl在里面的实现,也就是说,它们两者是相互依赖的,更确切说是boost库看起来比stl更高一层,依赖stl相关的功能进行底层实现。由于这样的特性,编程人员要想让自己的利用程序库发挥最强大的效能改进程序,那么最好的选择就是stlboost两者结合起来应用,这样可以将这两件武器挥出最大的能力。

一个真正c++编程能力较强的人要做到的不仅能够熟练应用这两种程序库,还要深入理解库函数的构造原理,甚至可以自己否造一个类似的函数库。

可以想象:一个战斗力强大的重量级战士,他一定是一个基本功很扎实的战士,扎实的基本功和充沛的体力让他能够做到左手拿着重剑,右手拿着巨斧,在战场上冲杀的时候这样的重型武器是斩杀敌人最好的工具。把编程的改进理解为一次进攻,那么请重视这两种武器的攻击带来的巨大杀伤力。

 

(二)关于boost

2.1 智能指针

 

稍微复杂的程序都会用到引用计数。

智能指针的作用

1 资源管理权限的转移,在共享时候经常发生这种转移。

2 保护代码的安全性。

3 防止资源泄露。

 

智能指针的实现和工作原理

 

 

使用智能指针的方式

1 入侵:指的是对于资源有管理和修改作用的一种访问和使用模式

2 非入侵:指的是只对于资源进行权限转移的,就是指针引用传递的一种调用方式。

 

实现非入侵最好的方式是托管类,就是类似设计模式外观模式那种结构型模式,如果使用入侵模式,则可以把基类做成一个抽象类,依靠子类的继承来实现对于引用的管理。

 

智能指针类的不同函数和作用

其实智能指针基类里面的不同函数主要由入侵和非入侵两个类型,

比如,share_ptr是基础,那么coper_ptr就是属于入侵类型的可用函数。

 

 

2.2   Utility

 

2.3  Regex

改进程序的方法 c++提供正则表达式的支持。

提高树如验证的健壮性。

 

2.4  any

 

这是一个可以创建任何类型的单独容器库

不同于stl里面的各种容器库

经过我的研究,我发现每一个any构造函数只能够创建一个内存地址 ,并且把数据存入相应的地址当中。目前的李留问题是stl的容器库里面的数据结构是什么样的?比如一个vector或者一个list就会创建一个个容器。

还需要强调的就是第一章曾经提到过的智能指针类里面的几个数组容器类

 

 

 

2.5  bind

 

bind 改进程序的方法

1 使得函数对象适用于标准库算法

2 使用一致的语法创建邦定器

3 强大的函数组合

 

 

要补充的知识

泛型编程

  泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。STL以迭代器 (Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(function objects)STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。

  泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。

关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。

 

 

 

百度这里给出的泛型编程的概念不是很确切

至少还不是很全面,比如stl中不全是泛型,只有在容器和函数模版这部分等等有这样的特性,其实说stl的容器等等也是泛型这样说也不太精确,泛型最大的特性就是(1)参数化传入(2)数值化计算

boost库里面分得很清楚,可以说,真正的泛型编程框架要比stl这个等级的库再封装的高一层。几乎不会再调用引用转递,只要消除或者减少引用传递,那么程序的可靠性就会提高,内存泄露这种事情就可以预防。

我的体会是这种东西比较类似于测试驱动中的测试用例。

 

真正的泛型编程:所谓泛型是指将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。

、目前得知boostarray库以及smart_ptr库中的smart_array类的性能要超过stlvector,但是没有相关的文档我只能上boost官方网站去查阅。待续。我又想到了开源引擎里面的一些array的构造。

 

 

两种程序库实现方法的区别

以上一部分我们谈到了booststl的基本性能对比以及互补应用。得知stlboost并不是平行的,在程序实现过程中,调用boost有很多库函数都可以添加甚至需要调用stl中的库函数。

 

下面介绍一下它们底层的不同实现模式,和不同的工作原理

首先boost,因为boost有很多库实现方法各异,本文只列举经过我的总结和研究后得出的类库的大体实现方式。

一般实现的框架和流程都是这样的

(1) 类模版声明类

(2) 在构造函数中传入一个const类型的参数,将函数指定。作用是根据参数传递的地址类确定类对象的地址。

(3) stlboost更常用,因为其规模比boost更加庞大,而且应用的层面相对广泛一些,比如容器这个部分,虽然vector没有boost里面的array类那么强悍,但是stl的总体容器门类可是比boost全面很多。从链表到图所有的数据结构都是构造过可以复用的函数库。总之就像重剑比战斧的用途广一样,stlboost更庞大能做很多事情。

(4) boost在一些功能部分比stl更加深入和强大。比如智能指针smart_ptr部分门类齐全,应用功能更多,要比stl里面的auto_ptr智能指针健壮和强悍很多。

 

 

以下是相同或者相似的特性

(1) 两者都具有可扩展性,stlboost都可以通过不同的接口修改或者扩充,扩充包括功能层面的扩充和原有功能函数的修改和重构。

未完待续。。。。。。

 

 

原创粉丝点击