当前位置:文档之家› Boost库学习指南

Boost库学习指南

Boost库学习指南
Boost库学习指南

Boost库学习指南和说明文档

作者:刘刚email:ganghust@https://www.doczj.com/doc/da1852757.html,

个人主页:https://www.doczj.com/doc/da1852757.html,2007年11月17号

Boost中文站

Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。本站主要介绍Boost相关的中文技术文档。

Boost入门

boost库简介

Windows和Solaris上Boost安装和编译

走进Boost(Boost使用入门)

Boost编程技术

C++Boost Thread线程编程指南

Boost中文文档

C++Boost Assign文档

C++Boost Regex文档

C++Boost Array文档

Boost源码剖析

Boost源码剖析之:型别分类器—type_traits

Boost源码剖析之:泛型指针类any之海纳百川

Boost源码剖析之:增强的std::pair——Tuple Types

Boost库学习指南和说明文档 (1)

Boost入门 (1)

Boost编程技术 (1)

Boost中文文档 (1)

Boost源码剖析 (2)

C++Boost学习资源列表 (3)

C++Boost库简介 (3)

Windows和Solaris上Boost安装和编译 (5)

0前言 (5)

1下载Boost+解包(略) (6)

2编译jam (6)

3设置环境变量 (6)

4编译Boost (7)

走进Boost[Boost使用入门] (8)

0摘要 (8)

1Boost简介 (9)

2Boost下载和Boost安装 (9)

3Boost组件lexical_cast (10)

4小结 (14)

5注释 (14)

Boost中的智能指针 (15)

Boost介绍 (15)

智能指针 (16)

智能指针的30秒介绍 (16)

深入shared_ptr实现 (19)

C++Boost Thread编程指南 (23)

0前言 (24)

1创建线程 (24)

2互斥体 (26)

3条件变量 (29)

4线程局部存储 (33)

5仅运行一次的例程 (35)

6Boost线程库的未来 (36)

7参考资料: (36)

C++Boost库文档索引 (37)

1按字母顺序库列表 (38)

2按主题库列表 (40)

C++Boost学习资源列表

boost的老巢https://www.doczj.com/doc/da1852757.html,

boost的中文站:https://www.doczj.com/doc/da1852757.html,

CSDN--Boost系列专题https://www.doczj.com/doc/da1852757.html,/Subject/336/index.shtm

Linux伊甸园论坛-STL/boost专区https://www.doczj.com/doc/da1852757.html,/forum/forumdisplay.php?f=37

dozb的blog https://www.doczj.com/doc/da1852757.html,

C++Boost库简介

boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化。不过对比STL,boost更加实用。STL集中在算法部分,而boost包含了不少工具类,可以完成比较具体的工作。

boost主要包含一下几个大类:字符串及文本处理、容器、迭代子(Iterator)、算法、函数对象和高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入/输出、跨语言支持、内存相关、语法分析、杂项。有一些库是跨类别包含的,就是既属于这个类别又属于那个类别。

在文本处理部分,conversion/lexcial_cast类用于“用C++”的方法实现数字类型和字符串之间的转换。主要是替代C标准库中的atoi、itoa之类的函数。当然其中一个最大的好处就是支持泛型了。

format库提供了对流的“printf-like”功能。printf里使用%d、%s等等的参数做替换的方法在很多情况下还是非常方便的,STL的iostream则缺乏这样的功能。format为stream增加了这个功能,并且功能比原始的printf更强。

regex,这个不多说了,正则表达式库。如果需要做字符串分析的人就会理解正则表达式有多么有用了。

spirit,这个是做LL分析的框架,可以根据EBNF规则对文件进行分析。(不要告诉我不知道什么是EBNF)。做编译器的可能会用到。一般人不太用的到。

tokenizer库。我以前经常在CSDN上看到有人问怎么把一个字符串按逗号分割成字符串数组。也许有些人很羡慕VB的split函数。现在,boost的tokenizer也有相同的功能了,如果我没记错的话,这个tokenizer还支持正则表达式,是不是很爽?

array:提供了常量大小的数组的一个包装,喜欢用数组但是苦恼数组定位、确定数组大小等功能的人这下开心了。

dynamic_bitset,动态分配大小的bitset,我们知道STL里有个bitset,为位运算提供了不少方便。可惜它的大小需要在编译期指定。现在好了,运行期动态分配大小的bitset来了。

graph。提供了图的容器和相关算法。我还没有在程序中用到过图,需要用的人可以看看。

multi_array提供了对多维数组的封装,应该还是比较有用的。

并发编程里只有一个库,thread,提供了一个可移植的线程库,不过在Windows平台上我感觉用处不大。因为它是基于Posix线程的,在Windows里对Posix的支持不是很好。

接下来的数学和数值类里,包含了很多数值处理方面的类库,数学类我也不太熟,不过这里有几个类还是很有用的,比如rational分数类,random随机数类,等等。

static_assert,提供了编译器的assert功能。

test库,一个单元测试框架,非常不错。

concept_check提供了泛型编程时,对泛型量的一点检查,不是很完善,不过比没有好。

数据类型类any,一个安全的可以包含不同对象的类。把它作为容器的元素类型,那么这个容器就可以包含不同类型的元素。比用void*要安全。

compressed_pair,跟STL里的pair差不多。不过对空元素做了优化。

tuple,呵呵,也许是某些人梦寐以求的东西。可以让函数返回多个值。

跨语言支持:python,呵呵,好东东啊,可以将C++的类和函数映射给python使用。以下为几个CSDN上的关于boost.python的中文资料:https://www.doczj.com/doc/da1852757.html,/article/19/19828.shtm,https://www.doczj.com/doc/da1852757.html,/article/19/19829.shtm,https://www.doczj.com/doc/da1852757.html,/article/19/19830.shtm,https://www.doczj.com/doc/da1852757.html,/article/19/19831.shtm

pool:内存池,呵呵,不用害怕频繁分配释放内存导致内存碎片,也不用自己辛辛苦苦自己实现了。

smart_ptr:智能指针,这下不用担心内存泄漏的问题了吧。不过,C++里的智能指针都还不是十全十美的,用的时候小心点了,不要做太技巧性的操作了。

date_time,这个是平台、类库无关的实现,如果程序需要跨平台,可以考虑用这个。

timer,提供了一个计时器,虽然不是Windows里那种基于消息的计时器,不过据说可以用来测量语句执行时间。

uitlity里提供了一个noncopyable类,可以实现“无法复制”的类。很多情况下,我们需要避免一个类被复制,比如代表文件句柄的类,文件句柄如果被两个实例共享,操作上会有很多问题,而且语义上也说不过去。一般的避免实例复制的方法是把拷贝构造和operator=私有化,现在只要继承一下这个类就可以了,清晰了很多。

value_initialized:数值初始化,可以保证声明的对象都被明确的初始化,不过这个真的实用吗?似乎写这个比直接写初始化还累。呵呵,仁者见仁了。

这里面除了regex、python和test需要编译出库才能用,其他的大部分都可以直接源代码应用,比较方便。其实这些库使用都不难。最主要的原因是有些库的使用需要有相关的背景知识,比如元编程、STL、泛型编程等等。

Windows和Solaris上Boost安装和编译

作者:大卫

1下载Boost+解包(略)

2编译jam

2.1Windows

2.2Solaris9

3设置环境变量

3.1Windows

3.2Solaris9

4编译Boost

4.1Windows

4.2Solaris9

0前言

大卫注:这是当初研究boost时的笔记,最近看到论坛上有人问,所以就贴出来共享一下。其实个人认为,boost目前还不适于进行应用开发,毕竟boost库太大了(当然,你可以只用一部分,但程序的可维护性始终是个问题),除非你想一探C++研究前沿的Meta Programming这个Generic Programming的神奇世界。强烈建议boost的研究者在研究boost之前研究一下一个小得多的模板库loki,boost中的很多让你无法理解的技术在loki库中被大量运用,并且这个库的作者专门写了

Modern C++Design来解说该库的实现。此外,如果你要研究boost,开始时不要编译所有的库,如Python,thread,test等,因为等你花几个小时编译完了,你可能发现,你根本就用不到这些库,或者对它根本就不感兴趣,等到你研究完比较小的几个库,对boost有了充分了解的时候再来编译也不迟。

注:

开始前请确认你的OS中已经安装了适当的编译器,以下Windows环境中以Windows2000+ VC6为例,Unix环境中以Solaris9+GCC3.4.2为例;

以下以$BOOSTDIR表示boost的存放目录,请自行根据实际情况进行修改。

1下载Boost+解包(略)

2编译jam

2.1Windows

到$BOOSTDIR\tools\build\jam_src下执行build.bat对jam进行编译,编译结果将存放在$BOOSTDIR\tools\build\jam_src\bin.ntx86下。如果你在执行该批处理程序过程中遇到问题,如报告无法找到编译器相关程序,请执行X:\Program Files\Microsoft Visual Studio\VC98\Bin\VCV ARS32.bat以建立VC的基本环境变量。

2.2Solaris9

到$BOOSTDIR\tools\build\jam_src下执行./build.sh对jam进行编译,编译结果将存放在$BOOSTDIR\tools\build\jam_src\bin.solarisx86下。

3设置环境变量

(注:这一步其实可以省略,直接在(三)中通过-s输入到命令行即可,但设置可以让命令行更清晰、简单一点。)

3.1Windows

我的电脑点右键->属性->高级->环境变量->user variable或system variable中:

PATH最后添加bjam存放目录,如:

$BOOSTDIR\tools\build\jam_src\bin.ntx86

新建环境变量MSVCDIR,并在变量值一栏中填入VC安装目录,如:

X:\Program Files\Microsoft Visual Studio\VC98

新建环境变量:

PYTHON_ROOT=X:\Program Files\Python2.3.4

PYTHON_VERSION=2.3

3.2Solaris9

在.profile中PATH后添加编译后的jam的存放目录。

并增加

PYTHON_VERSION=2.3

export PYTHON_VERSION

注意,无需设置PYTHON_ROOT,Solaris下jam会自动处理。

4编译Boost

4.1Windows

命令:

jam-sBOOST_ROOT=.-sTOOLS=msvc"-sBUILD=debug releasestatic/dynamic"

以上命令解释如下:

-s即set,设置环境变量;

BOOST_ROOT boost的存放目录

TOOLS你选择的toolset,如gcc、msvc(即vc6)、vc7.1,此外还有gcc-stlport、msvc-stlport、vc7.1-stlport,表示同时使用stlport。具体支持何种toolset,大家可以自行到$BOOSTDIR\tools\build\v1看个究竟。BUILD编译类型,上述选项表示编译出支持static和dynamic链接的debug和release 版本(4个版本)。

编译后的lib、dll将被copy到$BOOSTDIR\bin\boost\libs目录下,但是这些lib、dll分散在不同的目录下,为了便于使用,可以在上述目录下分别查找*.lib和*.dll找出这些文件,然后将他们分别全部copy到VC的lib目录和Windows的System32目录,也可以自己建立一个专门用于存放boost的lib 文件的目录,然后依次选择Tools->Options->Directories->Library files,将上述目录路径添加到VC的环境设置中。

4.2Solaris9

到$BOOSTDIR下执行以下命令:

jam-sBOOST_ROOT=.-sTOOLS=gcc"-sBUILD=debug releasestatic/dynamic"

但建议用如下命令:

jam-sBOOST_ROOT=.-sTOOLS=gcc"-sBUILD=releasedynamic speed"

这样可以极大加快编译的速度,同时,个人认为像boost这样大的库,最好还是采用动态链接以减小目标程序的size,就像libstdc++,还没有见过有人去静态链接libstdc++.a,虽然系统中提供了这个静态库。

走进Boost[Boost使用入门]

走进Boost[Boost使用入门]

0摘要

1Boost简介

2Boost下载和Boost安装

3Boost组件lexical_cast

3.1字符串→数值

3.2数值→字符串

3.3异常

3.4注意事项

4小结

5注释

0摘要

一直流传这么一个说法,想成为高手,一定要多读高手写的源代码。哪些代码是好材料呢?C++标准库的源代码?不,如果您读过,就会发现:要么是各种实现独有的表达方式让人摸不着头脑,要么是恐怖的代码风格(如到处是下划线)憋得人难受。Boost库的代码则相当清晰,注释合理,命名规范,绝对是适合阅读的典范。同时,Boost内容广泛,数值计算、泛型编程、元编程、平台API……不妨从容选择自己感兴趣的部分,细细品味。

在本文中,我们将会介绍了Boost库的下载与安装,并将体验Boost库中一个非常简单实用的组件lexcial_cast。

1Boost简介

Boost是什么?一套开放源代码、高度可移植的C++库。

谁发起的?C++标准委员会库工作组。所以,质量保证,不怕遇到假冒伪劣产品。

有些什么呢?瞧瞧:

正则表达式,可以与POSIX API和Perl语言处理正则表达式的功能相媲美,而且还能支持各种字符类型(如char、wchar_t,甚至还可以是自定义字符类型);

多线程,想了很久的跨平台多线程库了;

数据结构“图”,再加上即将加入标准的hash_set、hash_map、hash_multiset、hash_multimap等等(事实上不少STL实作,如SGI STL,已经支持以上数据结构),C++对数据结构的支持已近完备;

python,没错,对Python语言的支持;

智能指针,与std::auto_ptr一起善加使用,可杜绝内存泄露,效率更不可和垃圾收集机制GC同日而语;

更有循环冗余的CRC、可轻松定义返回多个值函数的元组tuple、可容纳不同类型值的any、对标准库各方面的补充……

还在迅速扩大中,部分内容有望进入C++标准库……

2Boost下载和Boost安装

去哪下载Boost呢?英文https://www.doczj.com/doc/da1852757.html,(1),中文https://www.doczj.com/doc/da1852757.html,,可以找到一个.zip 或.tar.gz格式的压缩包。下载完毕后,解压到某个目录,比如boost_1_26_0,里面一般有这么几个子目录:boost、libs、more、people、status、tools,看看没问题就行了。

如果Boost更新时您懒得去下载整个压缩包,只希望更新发生变动的文件;或者您是一位跟我一样的Boost Fans,希望跟踪Boost的最新变化,不妨使用CVS方式。首先得有一个CVS客户端软件,比如CvsGui或https://www.doczj.com/doc/da1852757.html,/projects/cvsgui/提供的WinCVS、gCVS和MacCVS,分别适用于Windows、Linux和MacOS平台。下载、安装、启动三步曲。

如果您习惯于传统CVS的命令行模式,那么可在Admin→Command Line...→Command line settings中输入下面一行2:

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"cvs-z3-d:pserver:anonymous@https://www.doczj.com/doc/da1852757.html,:/cvsroot/boost checkout boost

勾上下面的复选框,选择本地目标目录(比如可以新建一个C:\Boost,这凭个人爱好),再点击确定即可开始更新。如果是第一次运行,则可能需要一段时间下载所有文件。当然以后更新就只需要很短的时间了。

如果您偏好GUI模式,请选择Admin→Preferences...,在General的Enter CVS ROOT中填写:

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM: 0px"anonymous@https://www.doczj.com/doc/da1852757.html,:/cvsroot/boost

Authentication选择"passwd"file on the cvs server,同时Use version选择cvs1.10(standard)。然后在WinCvs的HOME folder中填写或选择一个本地目标目录,点击确定。选择View→Browse Location→Change...换到本地目标目录后,在Create→Check Module...→Checkout Settings 的Enter the module name and path on the server中填写boost,单击确定即可。如果这一过程中要求输入密码,不必理会,直接回车就行。这是WinCVS1.2的情况。如果您下载的是新的版本,请注意各项设置大同小异,如前面的Authentication选择pserver、不需要设置Use version 等。

然后设置编译器。以Windows常用集成环境为例。Microsoft Visual C++6.0,可在工具→选择→目录处把Boost的路径(如前面的boost_1_26_0)添加到Include Files搜索路径中。而对于Borland C++Builder5.0,则是在Project→Options→Directories/Conditionals→Include Path中添加Boost的路径。还有一种比较常用的Dev-C++ 4.0(内置GNU C++,可从https://www.doczj.com/doc/da1852757.html,处免费下载),可在Options→Compile Options→Directories→C++ include files处添加Boost的路径即可。其他IDE类似。至于命令行方式,则需在编译时对相应的头文件路径参数(Borland C++Compiler、GNU C++是-I,VC++的cl是/I)给出Boost路径。

做到这一步,恭喜您,大部分Boost库就可以用了。

为什么不是全部?首先,目前还没有一个能完全符合C++标准的编译器,所以Boost库中的组件或多或少不可用,详细信息请看Boost网站上“编译器支持情况(Compiler Status)”一文。另外,有些库需要Build相应的lib或dll文件。不过这样的库很少,主要是由于平台相关性的原因,如处理正则表达式的regex库、支持python语言的python库等,而建构库的过程相当烦琐,需要使用Jam工具(可以简单提一下:在tools/build/jam_src/builds目录下有三个文件win32-borlandc.mk、win32-gcc.mk、win32-visualc.mk,分别是适用于Windows平台下的Borland C++ Compiler、GNU C++和Visual C++的mak文件。如果在Unix平台,则应使用tools/build/Makefile。用命令行工具make或nmake来做出Jam执行文件,然后再用Jam来建构库,详细内容可见Boost.Build文档)。我个人的建议是,不用急着去建构lib或dll。真的需要使用这些库时,再make 随库提供的mak文件即可。虽然Boost.Jam也许是Boost库未来发展的方向,不过毕竟绝大部分库都无须建构,可以直接使用。

3Boost组件lexical_cast

这次我们先挑个简单实用的Boost组件,看看Boost能给我们带来怎样的便利。

3.1字符串→数值

在CSDN论坛上经常看到询问如何在字符串类型和数值类型间进行转换的问题,也看到了许多不同的答案。下面先讨论一下从字符串类型到数值类型的转换。

如何将字符串"123"转换为int类型整数123?答案是,用标准C的库函数atoi;

如果要转换为long类型呢?标准C的库函数atol;

如何将"123.12"转换为double类型呢?标准C的库函数atod;

如果要转换为long double类型呢?标准C的库函数atold;

……

后来有朋友开始使用标准库中的string类,问这个如何转换为数值?有朋友答曰,请先转换为const char*。我很佩服作答者有数学家的思维:把陌生的问题转化成熟悉的问题。(曾经有一则笑话,好事者问数学家:知道如何烧水吗?答:知道。把水壶加满水,点火烧。又问:如果水壶里已经有水了呢?答:先倒掉,就转化为我熟悉的问题了……)

不,不,这样是C的做法,不是C++。那么,C++该怎么做呢?使用Boost Conversion Library 所提供的函数lexical_cast(需要引入头文件boost/lexical_cast.hpp)无疑是最简单方便的。如:style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"#include

#include

int main()

{

using boost::lexical_cast;

int a=lexical_cast("123");

double b=lexical_cast("123.12");

std::cout<

std::cout<

return0;

}

一个函数就简洁地解决了所有的问题。

3.2数值→字符串

那么从数值类型到字符串类型呢?

用itoa?不对吧,标准C/C++里根本没有这个函数。即使在Windows平台下某些编译器提供了该函数3,没有任何移植性不说,还只能解决int类型(也许其他函数还可以解决long、unsigned long

等类型),浮点类型又怎么办?当然,办法还是有,那就是:sprintf。

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"char s[100];

sprintf(s,"%f",123.123456);

不知道诸位对C里的scanf/printf系列印象如何,总之阿炯我肯定记不住那些稀奇古怪的参数,而且如果写错了参数,就会得到莫名其妙的输出结果,调试起来可就要命了(我更讨厌的是字符数组,空间开100呢,又怕太小装不下;开100000呢,总觉得太浪费,心里憋气,好在C++标准为我们提供了string这样的字符串类)。这时候,lexical_cast就出来帮忙啦。

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"#include

#include

#include

int main()

{

using std::string;

const double d=123.12;

string s=boost::lexical_cast(d);

std::cout<

return0;

}

跟前面一样简单。

3.3异常

如果转换失败,则会有异常bad_lexical_cast抛出。该异常类是标准异常类bad_cast的子类。

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"#include

#include

int main()

{

using std::cout;

using std::endl;

int i;

try{

i=boost::lexical_cast("abcd");

}

catch(boost::bad_lexical_cast&e)

{

cout<

return1;

}

cout<

return0;

}

显然“abcd”并不能转换为一个int类型的数值,于是抛出异常,捕捉后输出“bad lexical cast: source type value could not be interpreted as target”这样的信息。

3.4注意事项

lexical_cast依赖于字符流std::stringstream(会自动引入头文件4),其原理相当简单:把源类型读入到字符流中,再写到目标类型中,就大功告成。例如

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"int d= boost::lexical_cast("123");

就相当于

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"int d;

std::stringstream s;

s<<"123";

s>>d;

既然是使用了字符流,当然就有些随之而来的问题,需要特别指出5。

由于Visual C++6的本地化(locale)部分实现有问题,因此如果使用了非默认的locale,可能会莫名其妙地抛出异常。当然,一般情况下我们并不需要去改变默认的locale,所以问题不是很大。

输入数据必须“完整”地转换,否则抛出bad_lexical_cast异常。例如

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"int i= boost::lexical_cast("123.123");//this will throw

便会抛出异常。因为“123.123”只能“部分”地转换为123,不能“完整”地转换为123.123。

浮点数的精度问题。

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"std::string s= boost::lexical_cast(123.1234567);

以上语句预想的结果是得到“123.1234567”,但是实际上我们只会得到“123.123”,因为默认情况下std::stringstream的精度是6(这是C语言程序库中的“前辈”printf留下的传统)。这可以说是boost::lexical_cast的一个bug。怎么办呢?权宜之计,可以这么做:打开头文件,注意对照修改6:

style="PADDING-BOTTOM:0px"style="PADDING-BOTTOM:0px"#include

//...

template

T arget lexical_cast(Source arg){

//...

T arget result;

interpreter.precision(std::numeric_limits::digits10);

if(!(interpreter<

!(interpreter>>result)||

!(interpreter>>std::ws).eof())

//...

}

即可得到正确结果。当然,理论上效率会有一点点损失,不过几乎可以忽略不计。

4小结

我们已经体验了boost::lexcial_cast。当然,lexical_cast不仅仅局限于字符串类型与数值类型之间的转换:可在任意可输出到stringstream的类型和任意可从stringstream输入的类型间转换。这次的了解尽管很粗略,不过毕竟我们已经“走进Boost”,而不仅仅是“走近”。以后,我们可以自行领略Boost的动人之处啦。

5注释

[1]如果您访问Boost英文网站出现DNS错误,不妨试试http://64.226.201.52/。

[2]请参考Boost文档中的“下载与安装说明(Boost Download and Installation)”部分。

[3]Borland C++Builder提供了itoa,而Microsoft Visual C++提供了一个功能相同的函数,不过名字是_itoa。

[4]有些不符合标准的标准库实现中,字符流类名是strstream,在头文件中。而标准规定的是stringstream,在头文件中。

[5]请参考的讨论。

[6]非常感谢Andrew Koenig和Bjarne Stroustrup两位的指教和帮助。最开始我的想法是,指定最大精度,加入interpreter.precision(15)之类的语句,然而又担心移植性的问题。Andrew Koenig 先生给出了非常明确的解释:You are quite correct that15is not portable across all floating-point implementations.However,it is portable across all implementations that support IEEE floating-point arithmetic,which is most computers that are in common use today.If you want to do better than that,you might consider using numeric_limits::digits10,which is the number of significant base-10digits that can be accurately represented in a double.(中文大意是,诚然,15并非可移植到所有浮点实现中,但对于支持IEEE浮点运算的实现来说,则的确是可移植的,而且,这也是现今绝大部分计算机所使用的。如果想做得更好一点,则可以考虑使用numeric_limits::digits10,就能表示出10进制下double能精确表达的位数。)

Boost中的智能指针

撰文Bjorn Karlsson翻译曾毅最后更新:2004年6月2日欢迎来到Boost,C++革新者出类拔萃的社群。如果你在C++标准库当中找不到你所需要的,很可能Boost已经为您准备好了他们的产品。

Boost介绍

根据Boost网站的介绍,Boost是“一个免费的,可移植的,同步评测的C++库,Boost堪称是新类库的典范,特别是其中那些能够与ISO C++标准库良好的协同工作的库。”但是Boost不仅仅是一个库的集合。它也是一个快速发展的开发者社区,这些开发者创建,使用以及参与讨论Boost 库。Boost社群不仅仅是维护着这个库,而且还为它的使用者和设计者提供学习交流的场所。这个库堪称是一个设计稳固类的精典范例,在下个版本发布之前你甚至感觉不到能够有什么地方还值得改进。加入Boost邮件列表上的讨论组(或者是活跃于其中,或者只是看看别人如何讨论)是提高你对库的设计的问题和解决方案的认识的非常好的方法。Boost还提供一个人数飞速增长的Boost使用者邮件列表,这个列表关注的内容集中在使用Boost库的问题上。Boost库的质量和他的技术标准是十分令人惊异的。Boost可移植性标准确保了当你将你的代码从一个平台上移动到另一个平台上时,你的库仍然会正常工作。最近的发布版本是Boost1.25.0,由从智能指针到正则表达式,直至可移植的线程库。Boost目前支持35个库,这些当中所有的内容都被社区的成员测试和使用过了。这些库都是可以免费使用的,它们当中的很多内容都已经被用于商业应用软件的开发。

Boost是C++社群中最为强大的一个之一。在2000名成员当中,很多的人都是世界顶级的C++程序员。这些成员之所以能够长期的参与到其中来是因为他们非常热爱同拥有最优秀的思维方法的程序设计者一同工作。他们同时很清楚他们的努力必定会对C++社群产生巨大的影响,因为你在Boost当中看到的大部分内容将成为融入未来C++标准的候选内容。

了解Boost最好的方法就是浏览Boost库。在这篇文章当中,我将向你介绍Boost的智能指针(smart pointer)库smart_ptr。smart_ptr是一个能够反映出Boost的创新以及完美设计的好例子。我建议你访问Boost的站点()来获取Boost集中的其它34个库的详细内容。

智能指针

相对来说比较小的Boost库之一便是smart_ptr。smart_ptr是我认为在C++标准中将会停止向前发展的库之一。这篇文章讨论了Boost当中的smart_ptr库。但首先,我将以一个对智能指针的简介开始。

智能指针的30秒介绍

智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。

事实上,智能指针能够做的还有很多事情,例如处理线程安全,提供写时复制,确保协议,并且提供远程交互服务。有能够为这些ESP(Extremely Smart Pointers)创建一般智能指针的方法,但是并没有涵盖近来。(可以查看[1]来了解关于这个主题的更为深入的内容,顺便提一下,Alexandrescu现在正在考虑将他的C++库Loki提交给Boost)。

智能指针的大部分使用是用于生存期控制,阶段控制。它们使用operator->和operator*来生成原始指针,这样智能指针看上去就像一个普通指针。

这样的一个类来自标准库:std::auto_ptr。它是为解决资源所有权问题设计的,但是缺少对引用数和数组的支持。并且,std::auto_ptr在被复制的时候会传输所有权。在大多数情况下,你需要更多的和/或者是不同的功能。这时就需要加入smart_ptr类。

smart_ptr类

在Boost中的智能指针有:

。scoped_ptr,用于处理单个对象的唯一所有权;与std::auto_ptr不同的是,scoped_ptr可以被复制。

。scoped_array,与scoped_ptr类似,但是用来处理数组的

。shared_ptr,允许共享对象所有权

。shared_array,允许共享数组所有权

scoped_ptr

scoped_ptr智能指针与std::auto_ptr不同,因为它是不传递所有权的。事实上它明确禁止任何想要这样做的企图!这在你需要确保指针任何时候只有一个拥有者时的任何一种情境下都是非常重要的。如果不去使用scoped_ptr,你可能倾向于使用std::auto_ptr,让我们先看看下面的代码:

auto_ptr MyOwnString?

(new string("This is mine to keep!"));

auto_ptr NoItsMine?(MyOwnString?);

cout<<*MyOwnString<

这段代码显然将不能编译通过,因为字符串的所有权被传给了NoItsMine。这不是std::auto_ptr 的设计缺陷—而是一个特性。尽管如此,当你需要MyOwnString达到上面的代码预期的工作效果的话,你可以使用scoped_ptr:

scoped_ptr MyOwnString?

(new string("This is mine to keep for real!"));

//Compiler error-there is no copy constructor.

scoped_ptr TryingToTakeItAnyway?

(MyOwnString?);

scoped_ptr通过从boost::noncopyable继承来完成这个行为(可以查看Boost.utility库)。不可复制类声明复制构造函数并将赋值操作符声明为private类型。

scoped_array

scoped_array与scoped_ptr显然是意义等价的,但是是用来处理数组的。在这一点标准库并没有考虑—除非你当然可以使用std::vector,在大多数情况下这样做是可以的。

用法和scoped_ptr类似:

typedef tuples::tupleint>ArrayTuple?;

scoped_array MyArray?(new ArrayTuple?[10]);

tuples::get<0>(MyArray?[5])="The library Tuples is also part of Boost";

tuple是元素的集合—例如两倍,三倍,和四倍。Tuple的典型用法是从函数返回多个值。Boost Tuple库可以被认为是标准库两倍的扩展,目前它与近10个tuple元素一起工作。支持tuple流,比较,赋值,卸包等等。更多关于Boost的Tuple库的信息请参考[2]和[3]。

当scoped_array越界的时候,delete[]将被正确的调用。这就避免了一个常见错误,即是调用错误的操作符delete。

shared_ptr

这里有一个你在标准库中找不到的—引用数智能指针。大部分人都应当有过使用智能指针的经历,并且已经有很多关于引用数的文章。最重要的一个细节是引用数是如何被执行的—插入,意思是说你将引用计数的功能添加给类,或者是非插入,意思是说你不这样做。Boost shared_ptr 是非插入类型的,这个实现使用一个从堆中分配来的引用计数器。关于提供参数化策略使得对

任何情况都极为适合的讨论很多了,但是最终讨论的结果是决定反对聚焦于可用性。可是不要指望讨论的结果能够结束。

shared_ptr完成了你所希望的工作:他负责在不使用实例时删除由它指向的对象(pointee),并且它可以自由的共享它指向的对象(pointee)。

void PrintIfString?(const any&Any){

if(const shared_ptr*s=

any_cast>(&Any)){

cout<<**s<

}

}

int main(int argc,char*argv[])

{

std::vector Stuff;

shared_ptr SharedString1?

(new string("Share me.By the way,

Boost.any is another useful Boost

library"));

shared_ptr SharedString2?

(SharedString1?);

shared_ptr SharedInt1?

(new int(42));

shared_ptr SharedInt2?

(SharedInt1?);

Stuff.push_back(SharedString1?);

Stuff.push_back(SharedString2?);

Stuff.push_back(SharedInt1?);

Stuff.push_back(SharedInt2?);

//Print the strings

for_each(Stuff.begin(),Stuff.end(),

PrintIfString?);

Stuff.clear();

//The pointees of the shared_ptr's

//will be released on leaving scope

//shared_ptr的pointee离开这个范围后将被释放

return0;

}

any库提供了存储所有东西的方法[2]HYPERLINK "file:///C:Documents%20and%20SettingsAdministrator桌面My%20Documents新建CUJhtml20.04karlsson%22%20l"[4]。在包含类型中需要的是它们是可拷贝构造的(CopyConstructible),析构函数这里绝对不能引发,他们应当是可赋值的。我们如何存储和传递“所有事物”?无区别类型(读作void*)可以涉及到所有的事物,但这将意味着将类型安全(与知识)抛之脑后。any库提供类型安全。所有满足any需求的类型都能够被赋值,但是解开的时候需要知道解开类型。any_cast是解开由any保存着的值的钥匙,any_cast与dynamic_cast的工作机制是类似的—指针类型的类型转换通过返回一个空指针成功或者失败,因此赋值类型的类型转换抛出一个异常(bad_any_cast)而失败。

shared_array

shared_array与shared_ptr作用是相同的,只是它是用于处理数组的。

shared_array MyStrings?(new Base[20]);

深入shared_ptr实现

创建一个简单的智能指针是非常容易的。但是创建一个能够在大多数编译器下通过的智能指针就有些难度了。而创建同时又考虑异常安全就更为困难了。Boost::shared_ptr这些全都做到了,下面便是它如何做到这一切的。(请注意:所有的include,断开编译器处理,以及这个实现的部分内容被省略掉了,但你可以在Boost.smart_ptr当中找到它们)。

首先,类的定义:很显然,智能指针是(几乎总是)模板。

template class shared_ptr{

公共接口是:

explicit shared_ptr(T*p=0):px(p){

//fix:prevent leak if new throws

try{pn=new long(1);}

catch(...){checked_delete(p);throw;}

}

现在看来,在构造函数当中两件事情是容易被忽略的。构造函数是explicit的,就像大多数的构造函数一样可以带有一个参数。另外一个值得注意的是引用数的堆分配是由一个try-catch块保护的。如果没有这个,你得到的将是一个有缺陷的智能指针,如果引用数没有能够成功分配,它

boost库的介绍

Boost是什么?一套开放源代码、高度可移植的C++库。 谁发起的?C++标准委员会库工作组。所以,质量保证,不怕遇到假冒伪劣产品。 Boost内容广泛,数值计算、泛型编程、元编程、平台API……不妨从容选择自己感兴趣的部分,细细品味。 有些什么呢?瞧瞧: 字符串及文本处理 Boost.Regex 正则表达式是解决大量模式匹配问题的基础。它们常用于处理大的字符串,子串模糊查找,按某种格式tokenize字符串,或者是基于某种规则修改字符串。由于C++没有提供正则表达式支持,使得有些用户被迫转向其它支持正则表达式的语言,如Perl, awk, 和 sed。Regex提供了高效和强大的正则表达式支持,基于与STL同样的前提而设计,这使得它很容易使用。Regex已被即将发布的Library Technical Report接受。更多的信息,请见"Library 5: Regex.". Boost.Spirit Spirit库是一个多用途的、递归的语法分析器生成框架。有了它,你可以创建命令行分析器,甚至是语言预处理器[1]。它允许程序员直接在C++代码里使用(近似于)EBNF的语法来指定语法规则。分析器非常难写,对于一个特定的问题,它们很快就变得难于维护和看懂。而Spirit解决了这些问题,而且达到了与手工制作的分析器一样或几乎一样的性能。 Boost.String_algo 这是一组与字符串相关的算法。包括很多有用的算法,用于大小写转换,空格清除,字符串分割,查找及替换,等等。这组算法是目前C++标准库里已有功能的扩展。 Boost.Tokenizer 这个库提供了把字符序列分割成记号(token)的方法。通用的语法分析任务包括了在已分割的文本流里查找数据。如果可以把字符序列视为多个元素的容器将很有帮助,容器中的元素被执照用户定义的规则所分割。语法分析就成为了在这些元素上进行操作的单个任务,Tokenizer正好提供了这种功能。用户可以决定字符序列如何被分割,在用户请求新的元素时,库将找出相应的记号。 数据结构, 容器, 迭代器, 和算法 Boost.Any Any库支持类型安全地存储和获取任意类型的值。当你需要一个可变的类型时,有三种可能的解决方案:

初学者 你应当如何学习C 以及编程

初学者,你应当如何学习C 以及编程 软件小兵 ruanjianxiaobing@sohu 作者:未知文章来源:天极Yesky软件频道 Javascript是世界上最受误解的语言,其实C 何尝不是。坊间流传的错误的C 学习方法一抓就是一大把。我自己在学习C 的过程中也走了许多弯路,浪费了不少时间。 为什么会存在这么多错误认识?原因主要有三个,一是C 语言的细节太多。二是一些著名的C 书籍总在(不管有意还是无意)暗示语言细节的重要性和有趣。三是现代C 库的开发哲学必须用到一些犄角旮旯的语言细节(但注意,是库设计,不是日常编程)。这些共同塑造了C 社群的整体心态和哲学。 单是第一条还未必能够成气候,其它语言的细节也不少(尽管比起C 起来还是小巫见大巫),就拿Javascript来说,作用域规则,名字查找,closure, for/in,这些都是细节,而且其中还有违反直觉的。但许多动态语言的程序员的理念我猜大约是学到哪用到哪罢。但C 就不一样了,学C 之人有一种类似于被暗示的潜在心态,就是一定要先把语言核心基本上吃透了才能下手写出漂亮的程序。这首先就错了。这个意识形成的原因在第二点,C 书籍。市面上的C 书籍不计其数,但有一个共同的缺点,就是讲语言细节的书太多——《C gotchas》,《Effective C 》,《More Effective C 》,但无可厚非的是,C 是这样一门语言:要拿它满足现代编程理念的需求,尤其是C 库开发的需求,还必须得关注语言细节,乃至于在C 中利用语言细节已经成了一门学问。比如C 模板在设计之初根本没有想到模板元编程这回事,更没想到C 模板系统是图灵完备的,这也就导致了《Modern C Design》和《C Template Metaprogramming》的惊世骇俗。 这些技术的出现为什么惊世骇俗,打个比方,就好比是一块大家都认为已经熟悉无比,再无秘密可言的土地上,突然某天有人挖到原来地下还蕴藏着最丰富的石油。在这之前的C 虽然也有一些细节,但也还算容易掌握,那可是C 程序员们的happy old times,因为C 的一切都一览无余,everything is figured out。然而《Modern C Design》的出世告诉人们,“瞧,还有多少细节你们没有掌握啊。”于是C 程序员们久违的激情被重燃起来,奋不顾身的踏入细节的沼泽中。尤其是,模板编程将C 的细节进一步挖掘到了极致——我们干嘛关心涉及类对象的隐式转换的优先级高低?看看boost::is_base_of就可以知道有多诡异了。 但最大的问题还在于,对于这些细节的关注还真有它合适的理由:我们要开发现代模板库,要开发active library,就必须动用模板编程技术,要动用模板编程技术,就必须利用语言的犄角旮旯,enable_if,type_traits,甚至连早就古井

心跳检测(应用Boost库)

毕业设计(论文) 题目 学院名称计算机科学与技术学院 指导教师 职称 班级本07计算机01班 学号 学生姓名

目录

摘要 随着Internet快速发展,大量的P2P出现给人们的生活交流带来许多便利。然而由于人们需求的不断提高,对于P2P系统的可靠安全行性,同时也提出了新的要求。对于覆盖世界的网络中,随时都有可能出现故障。对于研究者希望 P2P系统有自动检测到故障的原因自动修复的功能。在这方面许多人都在不断的进行研究实验。 本文研究的主要方面是P2P存储系统与故障维护中的心跳检测技术。心跳检测技术是一种检测网络连接故障的技术,根据服务端和客户端各自的心跳检测软件,相互之间发送消息即心跳报文来检测故障,判断网络连接是否正常,系统是否工作。这篇论文设计了一个能管理几百个外围节点的心跳检测系统。该系统是在Linux操作系统下,采用的TCP/UDP协议,以C/S模式,应用Boost库,以C++语言进行开发的。服务端为主控节点,客户端为外围节点,通过客户端发送心跳报文的方法来实现心跳检测。 关键词:P2P;心跳检测;Boost;Linux

ABSTRACT Along with the Internet fast development, massive P2P appears for people's life exchange brings many conveniences. However, as a result of the people demand's unceasing enhancement, regarding the P2P system's reliable security line, simultaneously also set the new request. Regarding in the cover world's network, It has the possibility to present the breakdown. Regarding the researcher hoped that the P2P system has the automatic detection breakdown reason and the automatic repair function. In this aspect many people are researching. This paper mainly researches the heart beat technology of P2P memory system and failure detection. Heat beat technology is the technology that it detects network fault, as sending messages between server and client. And it can estimate whether the network and P2P system are working naturally. The paper introduces the P2P system can manage hundreds of the client nodes . The system designs in the Linux platform, using TCP/UDP protocol, Boost libraries, C++ language and on the basis of C/S model. Server acts as the master node, the client acts as the external nodes, through the heart beat messages sent by the client to achieve the heart beat detection methods.

VC6.0下配置boost库

VC6.0下配置boost库 2008-10-11 09:18 https://www.doczj.com/doc/da1852757.html,/yysdsyl/archive/2007/09/12/1781546.aspx 最近做开发碰到了长字符串匹配、搜索的问题,最先想到的是使用正则表达式,简单、高效。 但是我用的开发工具是VC6.0,不支持正则表达式。 上网baidu一下,发现支持正则的库还真不少,大概有以下几种:boost,GNU,VC7带的ATL 中的和微软发布的greta。 网上的朋友对boost评价不错,决定就使用是它了! 1、接下来的就是下载boost库,网上很好找。我下载的是压缩包,20多M,解压后将近100多M。 我解压的目录是D:\boost 2、然后是编译,我只要支持正则表达式就可以,因此只需要编译 D:\boost\libs\regex\build目录下的文件。据说全部编译要花将近2个小时,没有验证过,在我家里的机器上编译正则表达式部分只用了不到5分钟。 网上介绍的如何编译最多的一篇文章是“VC利用boost库解析正则表达式”,如果有人能根据这篇文章编译成功不妨告诉小弟一声…… 以下是我的操作: 在“运行”里输入“cmd”,打开命令提示符; 输入命令“cd D:\boost\libs\regex\build”//设置当前目录 输入命令“D:”//转到当前目录 接下来是很关键的一步: 很多文章是这样说的“输入 nmake -fvc6.mak” 但是出现了“'nmake' 不是内部或外部命令,也不是可运行的程序或批处理文件。”的错误提示。 然后你就会拼命查找原因,结果又有文章上说是环境变量没配置好,然后给出一堆“set”。也有的文章说是运行一下visual studio安装目录下的VC98\Bin\VCVARS32.BAT文件就OK 了。 你按照文章作者的方法做的,结果发现问题依旧! 以上说法都是正确的,但是说得都不是很完整,出现错误提示的根本原因就是环境变量没配置好,不识别nmake命令,配置过jdk的朋友就很容易明白。如果按照作者的要求搞一堆“set”,未免大题小作了吧,因为我们只需要用一次'nmake' 就可以解决问题了。VCVARS32.BAT正式配置环境变量的批处理文件,但是配置的参数只在当前窗口有效,也就

了解 Boost Filesystem Library

了解 Boost Filesystem Library C++语言(实际上是C++标准)的最常见问题之一是,缺乏定义良好的库来帮助处理文件系统查询和操作。由于这个原因,程序员不得不使用本机操作系统提供的应用程序编程接口(Application Program Interfaces,API),而这使得代码不能在平台之间移植。以下面的简单情况为例:您需要确定某个文件是否是Directory 类型。在Microsoft? Windows? 平台中,可以通过调用GetAttributes库函数(在windows.h 头文件中定义)进行此操作: DWORD GetFileAttributes (LPCTSTR lpFileName); 对于目录,所得到的结果应该为FILE_ATTRIBUTE_DIRECTORY,而您的代码必须检查是否为此结果。在UNIX? 和Linux? 平台上,可以通过使用stat或fstat函数及sys/stat.h 中定义的S_ISDIR 宏来实现相同的功能。您还必须理解stat结构。下面是对应的代码: #include #include int main() { struct stat s1; int status = stat(, &s1); printf(“Path is a directory : %d\n”, S_ISDIR(s1.st_mode)); return 0; } 对于I/O 操作较多的程序,这样的不一致就意味着需要进行大量的工程工作才能在平台间移植代码。正是因为这个原因,我们才引入了Boost Filesystem Library。这个广泛使用的库提供了安全、可移植且易用的C++接口,用于执行文件系统操作。可以从Boost站点免费下载此库。 使用boost::filesystem 的第一个程序 在深入研究Boost Filesystem Library 的更多细节之前,请看一下清单1中所示的代码;此代码使用Boost API 确定某个文件的类型是否为Directory。 清单1. 用于确定某个文件的类型是否为Directory 的代码 #include #include “boost/filesystem.hpp” int main() { boost::filesystem::path path("/usr/local/include"); // random pathname bool result = boost::filesystem::is_directory(path); printf(“Path is a directory : %d\n”, result); return 0; } 此代码非常明了易懂,您并不需要了解任何系统特定的例程。此代码经过验证,能在不用修改的情况下在gcc-3.4.4 和cl-13.10.3077 上成功编译。

VS2010 C++下编译调试MongoDB源码

VS2010 C++下编译调试 MongoDB源码 考虑到m ongodb使用了boost库源码,参考m ongodb官方文档后,下载编译boost版本是1.42(时间为2010-2-2)或更新版本: boost版本1.42: https://www.doczj.com/doc/da1852757.html,/projects/boost/files/boost/1.42.0/boost_1_42_0.zip/download 下载boost源码之后,我把boost解压在D盘。 1.在D:\boost_1_42_0\下找到该批处理文件bootstrap.bat,以vs2010命令行方式运行它,并最终生成bjam.exe可执行文件(详细结果及错误信息见生成的bjam.log日志)。 2.将生成的bjam.exe文件拷贝到“D:\boost_1_42_0”目录下,运行下面命令行: bjam stage variant=debug --stagedir="d:\boost_1_42_0" --with-files ystem --with-thread --with-date_time --with-program_options --layou t=versioned threading=multi toolset=msvc-10.0 如下 图:

注:i.如果要生成release链接库文件,需将上面的variant设置成release,形如:bjam stage variant=release ..... ii.如果要全部生成使用下面编译选项 bjam ...... --build-type=com plete 编译过程可能会用一些时间,最终会在"D:\boost_1_42_0" 生成一个lib目录,里面包括刚生成的库文件。 3.下载已用vs2010编译的SpiderMonkey库文件及源码包,并将其解压到D盘下,下载链接: https://https://www.doczj.com/doc/da1852757.html,/dwight/vc2010_js 将该文件夹名称改为“js”(因为m ongodb项目会默认指定该路径寻找可用的lib及c源文件),

boost升压电路

一种实用的BOOST电路 0 引言 在实际应用中经常会涉及到升压电路的设计,对于较大的功率输出,如70W以上的DC /DC升压电路,由于专用升压芯片内部开关管的限制,难于做到大功率升压变换,而且芯片的价格昂贵,在实际应用时受到很大限制。考虑到Boost升压结构外接开关管选择余地很大,选择合适的控制芯片,便可设计出大功率输出的DC/DC升压电路。 UC3842是一种电流型脉宽调制电源芯片,价格低廉,广泛应用于电子信息设备的电源电路设计,常用作隔离回扫式开关电源的控制电路,根据UC3842的功能特点,结合Boos t拓扑结构,完全可设计成电流型控制的升压DC/DC电路,且外接元器件少,控制灵活,成本低,输出功率容易做到100W以上,具有其他专用芯片难以实现的功能。 1 UC3842芯片的特点 UC3842工作电压为16~30V,工作电流约15mA。芯片内有一个频率可设置的振荡器;一个能够源出和吸入大电流的图腾式输出结构,特别适用于MoSFET的驱动;一个固定温度补偿的基准电压和高增益误差放大器、电流传感器;具有锁存功能的逻辑电路和能提供逐个脉冲限流控制的PWM比较器,最大占空比可达100%。另外,具有内部保护功能,如滞后式欠压锁定、可控制的输出死区时间等。 由UC3842设计的DC/DC升压电路属于电流型控制,电路中直接用误差信号控制电感峰值电流,然后间接地控制PWM脉冲宽度。这种电流型控制电路的主要特点是: 1)输入电压的变化引起电感电流斜坡的变化,电感电流自动调整而不需要误差放大器输出变化,改善了瞬态电压调整率; 2)电流型控制检测电感电流和开关电流,并在逐个脉冲的基础上同误差放大器的输出比较,控制PWM脉宽,由于电感电流随误差信号的变化而变化,从而更容易设置控制环路,改善了线性调整率; 3)简化了限流电路,在保证电源工作可靠性的同时,电流限制使电感和开关管更有效地工作; 4)电流型控制电路中需要对电感电流的斜坡进行补偿,因为,平均电感电流大小是决定输出大小的因素,在占空比不同的情况下,峰值电感电流的变化不能与平均电感电流变化相对应,特别是占空比,50%的不稳定性,存在难以校正的峰值电流与平均电流的误差,即使占空比<50%,也可能发生高频次谐波振荡,因而需要斜坡补偿,使峰值电感电流与平均电感电流变化相一致,但是,同步不失真的斜坡补偿技术实现上有一定的难度。

boostlog

Boost Log 简介 Boost Log Overview VIM Research Group 先进感知与控制实验室 中国科学技术大学信息科学技术学院 2015年2月

修改记录 Index Author Revision Date Remark 1 江坤V1.0 2014-02-09 初始版本

1. 安装 (4) 1.1. 软硬件需求 (4) 1.1.1.软件需求 (4) 1.1.2.硬件需求 (4) 1.2. 安装流程 (4) 2. Boost log 简介 (5) 3. Boost Log 基本使用流程 (6) 3.1. 案例一:Boost Log简单输出到控制台 (6) 3.2. 案例二:Boost Log简单输出到控制台 (7) 3.3. 案例三:Boost Log简单输出到控制台 (7) 4. 结论 (9)

本文档用于描述boost log 的安装,日常使用以及功能扩展。 1.安装 本部分描述boost 1.57.0的安装方法。 1.1.软硬件需求 1.1.1.软件需求 安装boost库的主机需支持GCC和GCC-C++之外,还需要两个开发库:bzip2-devel 和python-devel。 1.1. 2.硬件需求 运行Ubuntu12.04操作系统的主机一台。 1.2.安装流程 首先于Boost Libraries的官网下载Boost 1.57.0的安装包,下载地址如下http://www.boost .org/users/history/version_1_57_0.html。然后解压缩,进入到boost_1_57_0的目录下。 若在本机之前已安装过老版本的boost库,需要将之前include文件夹下和动态库中boost 库的相关文件删除,然后再编译安装,由于boost源码包中自带配置脚本,可直接使用,即运行booststrap.sh这个脚本配置。然后按照提示信息,输入sudo ./b2指令编译,然后就是漫长的等待,等待其是否编译成功。当输出如下信息表明编译成功: 若为安装成功需按照提示信息做相应处理,若未安装bzip2-devel 或python-devel会提示报错此时需安装相应的库,再重新安装。 最后运行./b2 install --prefix=/usr/local指令完成boost库的安装,安装后的头文件在 /usr/local/include/boost里面,而相应的库在/usr/local/lib/libboost_*。

高升压比交错并联Boost电路的分析

高升压比交错并联Boost电路的分析 类别:电源技术阅读:869 摘要:文章分析了传统BooST电路在实际应用中存在的问题,提出了一种改进型的交错并联Boost电路。在电感电流连续模式下,根据占空比大于或小于0。5的情况,详细分析电路的工作过程,推导了稳态情况下输出输入电压关系式,最后通过仿真验证了理论分析的正确性。0 引言升压变换器是最常用的一种变换器,随着新能源的推广,由于太阳能、燃料电池、蓄电池等输入源具有输入电压较低的特性,升压变换器成为不可或缺的关键部件。常用的非隔离Boost升压变换器,在高输出电压场合,由于寄生参数的影响不可能达到很高的输入输出电压比。而另一种升压电路是隔离升压电路,例如正激、反激电路。隔离升压电路中必须用到的变压器通常具有隔离、变压的功能,在那些不需要隔离或体积要求较小的应用场合,通过变压器升压就很难满足要求,另外变压器漏感引起的一系列问题,比如开关电压过冲,EMI等,常常对电源本身及周围设备带来安全隐患。 为了克服常用升压变换器在大功率、高输入输出变比等场合应用的限制,本文研究分析了一种新的电路拓扑结构及其工作方式,并对其进行了仿真验证。 1 工作原理下面分析Boost电路存在的不足,在理想情况下: M(D)=U0Uin= 11-D(1)根据式(1),在一定的输入电压下,理论上可以产生任意高于输入电压的输出电压。而实际情况中,由于电感、二极管、开关管都会产生一定的损耗,这些损耗可以等效为一个与电感串联的电阻RL,如图1所示: 图 1 Boost等效电路图此时根据磁平衡原理: 由式(2)、(3)可得:

根据式(4),在不同的RL/R 情况下,M(D)如图2所示。由此可见,在实际电路中,Boost电路升压比有限制极限,输出电压一般能达到输入电压的4~5倍。在大功率应用环境中,由于损耗严重,升压比反而更低。 为了克服上述非隔离升压电路的不足,本文研究的升压变换器如图3所示,它由交错并联Boost电路与电容串联组合而成。 图 2 升压比与占空比关系曲线图 图3 高升压比交错并联Boost电路结构图在电感电流连续模式下,当占空比大于0。5时,系统工作原理时序如图4所示,PS1、PS2分别为开关管S1、S2的驱动脉冲。ID1、ID2分别为流过续流二极管D1、D2的电流。

Windows版bjam的安装和配置

1、下载boost(或bjam)的源码,在命令行下执行如下命令: cd \tools\jam\src .\build.bat 其中指的是boost源码的根目录。这两条命令执行完毕,会产生一个bin.ntx86文件夹,里面含有一个编译生成的bjam.exe。将bjam.exe复制到C:\WINDOWS目录(或者PATH环境变量的其它取值)下。 2、在C:\Documents and Settings\All Users目录(或其它任意目录亦可)新建一个名为boost 的目录(取bjam或其它名字亦可,后面环境变量的值与此一致即可),将 \tools\build\v2目录及其前两级父目录复制到该boost目录里,则此时在C:\Documents and Settings\All Users\boost\tools\build\v2目录里可找到一个boost-build.jam文件,打开该文件并将boost-build的值改为: boost-build “C:/Documents and Settings/All Users/boost/tools/build/v2” ; 要注意此处的路径要用斜杠来隔开,但前面执行的命令涉及到的路径则用反斜杠隔开。另外,分号与前面的文字要有空格。 3、仍然在v2文件夹下,打开user-config.jam文件,找到以下一行: # using msvc ; 将“#”去掉。 4、添加BOOST_ROOT环境变量。具体操作为:右击“我的电脑”,选择“属性”->“高级”->“环境变量”,在“系统变量”方框下方点击“新建”,出现新建系统变量对话框。变量名填上BOOST_ROOT,变量值填上“C:\Documents and Settings\All Users\boost\tools\build\v2”(此路径即boost-build.jam所在的目录,注意要用英文环境下的双引号括起来)。至此,bjam 编译环境配置完成。 5、如果步骤4的环境变量不起作用,则用户的每个工程源码根目录必须存在一个步骤2修改好的boost-build.jam,bjam程序方可正常工作。但由于bjam会从工程根目录逐级搜索至工程所在磁盘分区根目录,若在每个磁盘分区根目录都复制一份boost-build.jam,则不管用户将工程源码放在什么地方,bjam程序都能正常读取boost-build.jam,然后编译工程了。 注意:在装bjam之前,必须保证系统中已安装了Visual Studio,否则无法编译出bjam.exe。如果想删除bjam,只需手动将C:\WINDOWS\bjam.exe、boost目录(用户创建的)和相关环境变量删除即可。 已发现及解决问题: 1、Visual Studio 2010的设置问题 如果系统安装的是Visual Studio 2010,则还需要向系统环境变量添加以下路径(假设VS安装在D盘): D:\Program Files\Microsoft Visual Studio 10.0\VC\bin 否则在编译bjam或者利用bjam编译用户工程时会报错,前者会提示找不到cl等命令,后者则会提示多个jam文件运行出错。

Boost编译和安装说明

Boost编译和安装说明 一、下载和安装 从官方主页https://www.doczj.com/doc/da1852757.html,下载最新版,因为boost一部分类是需要编译成库才能使用的,所以需要准备好boost专用的编译辅助工具bjam。可直接使用boost安装包中附带的bjam源码来编译出bjam。 将boost安装包解压到E:\boost_1_53_0,运行E:\boost_1_53_0\bootstrap.bat批处理,会复制E:\boost_1_53_0\tools\build\v2\engine\ bin.ntx86\bjam.exe到目录E:\boost_1_53_0\下,注意最后bjam.exe必须与boost-build.jam在同级目录。 二、编译 打开命令提示符(cmd.exe)窗口并执行bjam,使用--help查看命令帮助。bjam的命令行参数涉及具体库的选择,会影响编译后的硬盘空间。 使用bjam命令如:bjam stage --toolset=msvc-10.0 --without-python --without-wave --without-test --stagedir="E:\boost_1_53_0_vc10" link=shared runtime-link=shared threading=multi debug release 下面详细解释一下每个参数的含义: 1)stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的 include目录。推荐使用stage,因为install生成的这个include目录实际就是boost 安装包解压缩后的boost目录(E:\boost_1_53_0\boost,只比include目录多几个非hpp的小文件),可以直接使用,而且不同的IDE都可以使用同一套头文件。 2)toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)、 msvc-10.0(VS2010)等。 3)without/with:选择不编译/编译哪些库,默认是全部编译。例如,without-python意 思是不需要编译python库。如果选择编译python的话,应该到python官方主页 https://www.doczj.com/doc/da1852757.html,下载安装。 4)stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文 件的路径。如果使用了install参数,那么还将生成头文件目录。推荐给不同的IDE 指定不同目录 5)build-dir:编译生成的中间文件的路径。默认就在根目录(E:\boost_1_53_0)下,目 录名为bin.v2,等编译完成后可具体查看一下是否生成了lib、dll文件。如果不需要可直接删除bin.v2目录 6)link:生成动态链接库/静态链接库。动态链接库使用shared方式,静态链接库使用 static方式。注意,static方式下生成的很多静态链接库大小都在几兆、几十兆。不推荐以static方式编译(without掉),巨型库黑名单:wave、graph、math、regex、test、program_options、serialization、signals。 7)runtime-link:动态/静态链接C/C++运行时库,有shared和static两种方式,与link 参数组合有4种方式。但通常一个工程用动态链接那么所有库都用动态链接,如果用静态链接那么所有库都用静态链接。所以只需要编译2种组合即可,即link=shared runtime-link=shared和link=static runtime-link=static。 8)threading:单/多线程编译。一般使用多线程程序,要指定multi方式;如果需要单线 程环境,使用single方式。

Apache Mesos底层基础库

Apache Mesos底层基础库 Protocal Buffer是google开源的用于数据交换的库,常用于跨语言的数据访问,担任的角色一般为对象的序列化反序列化。另一个与之类似的开源软件是facebook开源的thrift,它们两个最大区别是thrift提供了自动生成RPC的功能而Protocal Buffer需要自己实现,但Protocal Buffer 的一个优势是其序列化反序列化非常高效。 AD: 1.Protocol buffer Protocal Buffer是google开源的用于数据交换的库,常用于跨语言的数据访问,担任的角色一般为对象的序列化反序列化。另一个与之类似的开源软件是facebook开源的thrift,它们两个最大区别是thrift提供了自动生成RPC的功能而Protocal Buffer需要自己实现,但Protocal Buffer 的一个优势是其序列化反序列化非常高效。 2.Libprocess libprocess是采用CC++编写的高效消息传递编程模型(基于消息传递的网络通信模型,而不是RPC),由伯克利开源。其整个实现非常简单,包括最基本的消息发送和接收等。 2.1Libprocess模型 在mesos中,主要有四个角色,分别是:mesos-master,mesos-slave,framework(HadoopSpark MPI等)scheduler,executor(在mesos-slave上执行framework task的组件),每种角色均是一个Process,在实现时会继承libprocess中的ProtobufProcess类(它又继承了Process类),这样,它们均会编成一个后台运行且不断监听protocal buffer消息的socket server,如下图所示: 2.2各种常用函数 Libprocess+protocol buffer组合是mesos最底层最重要的消息传递基础库(没有采用RPC机制),由于该库采用了基于Protocal Buffer消息传递的通信机制),因而非常高效。Mesos常用的两个头文件是libprocess\include\process下的process.hpp和protobuf.hpp,这两个提供了用于消息传递的API,其中process.hpp是最核心的文件水草玛瑙 https://www.doczj.com/doc/da1852757.html,,提供了原始的接口,而protobuf.hpp是在process.hpp基础上,加入了ProtocalBuffer对象参数,使ProtocalBuffer使用起来更加容易。 (1) install void install(void (T::*method)(P1C),P1 (M::*param1)() const); 安装一个处理ProtocalBuffer消息的handler,其中,消息类型是M,该消息对应的处理函数是method,函数参数为M::*param1。举例:mesos中slaveslave.cpp: install( Slave::newMasterDetected, NewMasterDetectedMessage::pid); 安装一个处理NewMasterDetectedMessage(ProtocalBuffer对象)的handler,mesos slave一旦接收到该消息,便会调用newMasterDetected函数处理,且该函数的输入参数是NewMasterDetectedMessage消息中的pid属性。 voidinstall(conststd::string name,void(T::*method)(constUPID ,conststd::string )) 安装一个处理字符串的handler,也就是说,当收到字符串name后,调用函数method进行处理。这个API在mesos中的典型应用时高山茶 https://www.doczj.com/doc/da1852757.html,维持master与slave之间的心跳,以确定彼此活着: 在slaveslave.cpp中: install( PING , Slave::ping);voidSlave::ping(constUPID from,conststring body){send(from, PONG } 在mastermaster.cpp中: install( PONG , SlaveObserver::pong);voidpong(constUPID from,conststring body){timeouts=0;pinged=false;}voidtimeout(){if(pinged){Sowehaven'tgotbackapongyet...if(++timeo uts =MAX_SLA VE_TIMEOUTS){deactivate();return;}}send(slave, PING );pinged=true;delay(SLA VE_PONG_TIMEOUT,self(), SlaveObserver::timeout);} (2) send voidsend(constprocess::UPID to,constgoogle::protobuf::Message message) 向某个UPID上发送消息,其中UPID代表一个socket,里面含有ip和port信息,而消息message

boost库编译

①打开你是boost_1_37_0文件夹 ②打开tools/jam/src ③点击build.bat 稍等一下会生成一个新的文件夹,打开里面有一个bjam.exe,复制它然后将它粘 贴到boost_1_37_0文件夹里面 然后打开vc2005的命令行:开始->所有程序->visualstudio 2005->visual sudio tools->命令提示(也就是那个黑色doc的标志) (许多人用cmd 那个doc命令,许多情况下是不行的,我就试过) 假如你的boost文件夹在E:/boost_1_37_0; 那么可以这样打命令: 1 E:然后回车 2 cd boost_1_37_0 然后回车 3 bjam.exe 然后回车 你的boost库就开始编译了,时间很长~ 剩下的别人也说得较为清楚,呵呵,;-), 我玩boost很久了,从1.34开始就一直玩,很不错 4 回答者:a_xr13800 - 二级 2009-1-7 22:01 我来评论>>提问者对于答案的评价: 谢谢哦 相关内容 ? boost 1_33_1 在VC6.0上的安装出现问题 2006-12-17 ? 1.0 bar boost是什么意思 2009-2-7 ? 笔记本《上、下、左、右,》键不起作用调不成boost引导顺序,怎样装系 统啊 2010-5-12 ? 联想Y460 I3 intel turbo boost technology device驱动装不了,是什么原 因 3 2010-8-1 ? 我的主板是技嘉770t-us3 装了easy tune 6 可是找不到easy boost 2010-4-28 等待您来回答更多 ?2回答为什么不用卫星来测控嫦娥二号? ?2回答xyhhdh商业理财 ?0回答最近刚买的房子,走的是商业贷款,现交完订金,马上就去交首付款,我... ?0回答用VS2008 新建一个MFC单文档工程,菜单里的改变应用程序外观是怎么实现... ?1回答visual studio 2008 SP1里有STL吗?? ?2回答各位编程爱好者,请帮我看看这道C语言题,将中缀表达式转化为后缀表达... ?2回答请问高手,汉武大帝第七集里贵妃们玩的什么游戏???

boost库命名规则的优点

boost库命名规则的优点 作者:朱金灿 来源:https://www.doczj.com/doc/da1852757.html,/clever101 我们编译出来的二进制库文件该如何命名呢?当我经验尚浅时,发现这个不 是问题——就以工程名来命名呗。但慢慢发现这种命名是有很多问题的(特别是当你升级编译器时,比如从VS 2005升级到VS2010时,或者是软件打包时):比如debug版本和release版本的库区分不开,不同版本的编译器编出的库区分不开(很多时候面对一个库你不知道它是VC6.0、VS 2005还是VS 2008编出来的),静态 库还是导入库区分不开,代码库的版本不知道……可能你会说:不是有个depends 工具,用它打开查看一下就知道了。问题一是假如库文件很多时,谁愿意一一去查看;二是静态库还是导入库靠depends工具是判断不出来的。而在开发时混用不同版本的库文件,会造成很多莫名其妙的问题。 如何解决这个问题?唯有靠规范的命名。怎样才算是规范的库文件命名?我觉得指导原则应该是见名知意。如果根据见名知意这个原则来衡量,我发现boost库 是做得比较规范的。关于boost库的命名规则,具体请见这篇文章:Boost 库命名 规则(翻译)。boost库的命名,涵括了下面几方面信息: 1.库的功能信息(即是序列化库、正则库还是其它功能的库) 2.静态库还是导入库(静态库以lib开头) 3.构建该库的具体编译器信息 4.线程标签(是多线程还是单线程) 5.影响库与其它编译代码的互操作性的细节的编码(debug版本还是release版 本,是否使用了STLPORT) 6.boost库的版本信息 面对这样规范的命名,你还会混用吗?据此我也简单制定了一个Windows环境下的库文件的命名规则: 静态库命名:lib+工程名_编译器信息_版本信息_互操作性细节信息.lib, 这里的互操作性细节信息初步分为debug版本、release版本以及多字节版本和unicode版本。 一个简单例子就是libpng_vc80_1_3_d.lib,表示这个是由VS 2005编译出来的png静态库,是debug版本(.lib前面用一个d来区分),库版本为V 1.3,采用多字节字符集编译。(对应的release版本命名为libpng_vc80_1_3.lib)。如果是unicode版本,名称则是libpng_vc80_1_3_ud.lib和libpng_vc80_1_3_u.lib (多了一个字母u)。

boost电路设计介绍

BOOST电路设计介绍 0 引言 在实际应用中经常会涉及到升压电路的设计,对于较大的功率输出,如70W以上的DC/DC升压电路,由于专用升压芯片内部开关管的限制,难于做到大功率升压变换,而且芯片的价格昂贵,在实际应用时受到很大限制。考虑到Boost升压结构外接开关管选择余地很大,选择合适的控制芯片,便可设计出大功率输出的DC/DC 升压电路。 UC3S42是一种电流型脉宽调制电源芯片,价格低廉,广泛应用于电子信息设备的电源电路设计,常用作隔离回扫式开关电源的控制电路,根据UC3842的功能特点,结合Boost拓扑结构,完全可设计成电流型控制的升压DC/DC电路,且外接元器件少,控制灵活,成本低,输出功率容易做到100W以上,具有其他专用芯片难以实现的功能。 1 UC3842芯片的特点 UC3842工作电压为16~30V,工作电流约15mA。芯片内有一个频率可设置的振荡器;一个能够源出和吸入大电流的图腾式输出结构,特别适用于MoSFET的驱动;一个固定温度补偿的基准电压和高增益误差放大器、电流传感器;具有锁存功能的逻辑电路和能提供逐个脉冲限流控制的PWM比较器,最大占空比可达100%。另外,具有内部保护功能,如滞后式欠压锁定、可控制的输出死区时间等。 由UC3842设计的DC/DC升压电路属于电流型控制,电路中直接用误差信号控制电感峰值电流,然后间接地控制PWM脉冲宽度。这种电流型控制电路的主要特点是: 1)输入电压的变化引起电感电流斜坡的变化,电感电流自动调整而不需要误差放大器输出变化,改善了瞬态电压调整率; 2)电流型控制检测电感电流和开关电流,并在逐个脉冲的基础上同误差放大器的输出比较,控制PWM脉宽,由于电感电流随误差信号的变化而变化,从而更容易设置控制环路,改善了线性调整率; 3)简化了限流电路,在保证电源工作可靠性的同时,电流限制使电感和开关管更有效地工作; 4)电流型控制电路中需要对电感电流的斜坡进行补偿,因为,平均电感电流大小是决定输出大小的因素,在占空比不同的情况下,峰值电感电流的变化不能与平均电感电流变化相对应,特别是占空比,50%的不稳定性,存在难以校正的峰值电流与平均电流的误差,即使占空比<50%,也可能发生高频次谐波振荡,因而需要斜坡补偿,使峰值电感电流与平均电感电流变化相一致,但是,同步不失真的斜坡补偿技术实现上有一定的难度。 2 Boost电路结构及特性分析 2.1 由UC3842作为控制的Boost电路结构 由UC3842控制的Boost拓扑结构及电路分别如图1和图2所示。

相关主题
文本预览
相关文档 最新文档