![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Boost
文章平均质量分 80
阳光开朗男孩
躺平才是王道
展开
-
Boost开发指南-4.13小结
operators库很强大易用,但保证操作符具有正确的语义还是程序员自己的责任,操作符的重载应该与它原来的含义基本一致——至少不能违背大多数人的常识。变量值的交换是一个看似简单实则复杂的操作,它被用来处理异常安全性和类的自我赋值,如果想要自己的类安全高效,那么应该提供一个好的swap函数,它是很多实用功能的基础,Boost 库中几乎所有的类都有swap()成员函数就清楚地说明了这一点。操作符重载简化了代码的编写,提供了清晰易懂的语法,但实现操作符重载是件烦琐的工作。原创 2023-08-29 11:37:52 · 71 阅读 · 0 评论 -
Boost开发指南-4.12utility
除了最基本最通用的 BOOST_BINARY宏之外,本组件还包含形如 BOOST_BINARY_XX的宏,其中的xx是标准的整数扩展,如 u(unsigned int)、UL(unsigned long)等,用以支持需要特定整数类型的地方。GCC编译器在C89的__FILE__和__LINE__之外定义了一些扩展宏,其中的__PRETTY_FUNCTION__宏可以表示函数名称,VC、intel C等编译器也定义有类似的宏,而C99标准则定义了__func__宏以实现同样的功能。原创 2023-08-29 11:28:33 · 110 阅读 · 0 评论 -
Boost开发指南-4.11config
BOOST_STRINGIZE是一个宏,这一点很重要,意味着它仅能用于编译期(准确地说是编译前预处理时),不支持运行时转换。代码的前两条语句运用了BOOST_STRINGIZE,把编译期的整数转换成了字符串,而第三个 BOOST_STRINGIZE因无法处理运行时的整数变量,只能把它转换成字面意义的字符串。一般来说,config库不应该被库用户使用,不过在这个库里,我们也可以找到几个有用的小工具(其实在第1章我们就已经用到了config库里的BOOST_PLATFORM等宏)。原创 2023-08-29 11:11:00 · 109 阅读 · 0 评论 -
Boost开发指南-4.10uuid
class uuidpublic://长度,返回16//内部实现在以上列出的成员函数之外,uuid还全面支持比较操作和流输入/输出。两个uuid 值的比较是基于字典序的,通常的比较操作使用的是memcmp,但针对x86做了特殊的优化以加快速度。uuid的名字生成器使用了SHA1摘要算法,这是一个很重要的密码学算法,可以将任意长度的文本压缩成一个只有20字节(160位)的独一无二的摘要,被广泛地应用于防篡改、身份鉴定等安全认证领域。原创 2023-08-28 18:35:06 · 281 阅读 · 0 评论 -
Boost开发指南-4.9exception
exception库提供两个类:exception和error_info,它们是exception库的基础。protected:private :exception类几乎没有公开的成员函数(但有大量用于内部实现的私有函数和变量),被保护的构造函数表明了它的设计意图:它是一个抽象类,除了它的子类,任何人都不能创建或者销毁它,这保证了exception不会被误用。exception的重要能力在于其友元操作符原创 2023-08-25 17:14:58 · 201 阅读 · 0 评论 -
Boost开发指南-4.8operators
明白了less_than_comparable 的继承用法,剩下的就很简单了:point类定义了一个友元operator、=就由less_than_comparable自动生成。由于C++可重载的操作符非常多,因此 operators库是由多个类组成的,分别用来实现不同的运算概念,比如 less_than_comparable定义了原创 2023-08-22 18:42:30 · 131 阅读 · 0 评论 -
Boost开发指南-4.7tribool
public://缺省构造函数//bool值构造函数//初始化为不确定值//bool转型//判断是否是不确定状态... //其他逻辑运算符和比较运算符重载tribool 类很简单,它内部实现了三态 bool值的表示,除了构造函数没有什么其他成员函数。可以在创建tribool对象的同时传入三态bool值对它进行初始化,如果使用无参的缺省构造函数,那么tribool默认值是false。对tribool的操作都是通过逻辑运算符和比较运算符的重载来完成的,支持的逻辑运算包括||、&&和!原创 2023-08-17 13:30:31 · 103 阅读 · 0 评论 -
Boost开发指南-4.6singleton
public:singleton把模板参数T实现为一个单件类,对类型T的要求是有缺省构造函数,而且在构造和析构时不能抛出异常,因为单件在main()前后构造和析构,如果发生异常则会无法捕获。singleton提供两个静态成员函数访问单件实例,可分别获得常对象和可变对象。这种区分是出于线程安全的考虑,常对象单件总是线程安全的,因为它不会改变内部状态,而可变对象单件则不是线程安全的,可能会发生线程竞争问题。原创 2023-08-16 16:39:25 · 118 阅读 · 0 评论 -
Boost开发指南-4.5swap
boost::swap查找有无针对类型T的std::swap()的特化或者通过ADL查找模板特化的 swap(),如果有则调用,如果两种查找都失败时则退化为std::swap()。这段代码的运行结果与之前的特化std::swap有明显不同,std::swap使用了标准的交换操作,而 boost::swap通过ADL 规则找到了全局名字空间的特化交换函数,实现了高效的交换。由于我们在名字空间特化了std::swap,因此,boost::swap与std::swap的效果相同,都使用了特化后的swap函数。原创 2023-08-15 11:42:07 · 135 阅读 · 0 评论 -
Boost开发指南-4.4assign
使用list_of()处理map容器不是很方便,于是map_list_of()/pair_list_of()应运而生,map_list_of()可以接受两个参数,然后自动构造std::pair对象插入map 容器,pair_list_of()则纯粹是map_list_of的同义词,两者的用法功能完全相同。list_of()函数可以全部使用括号操作符,也可以把括号与逗号结合起来,但使用后者时需要将整个list_of表达式用括号括起来,否则会使编译器无法推导出list_of的类型而无法赋值。原创 2023-08-14 18:58:01 · 578 阅读 · 0 评论 -
Boost开发指南-4.3optional
/定义类型none_t//定义类型none_t none_t const none =(static_cast < none_t >(0));//定义常量none(0));//定义常量noneboost::none有些类似C++11标准里的空指针nullptr,表示未初始化,它的none_t类型实际上是一个成员变量指针,“指向”并不存在的detail::none_helper的int成员。原创 2023-08-10 18:58:21 · 216 阅读 · 0 评论 -
Boost开发指南-4.2ignore_unused
ignore_unused使用可变参数模板,可以支持任意数量、任意类型的变量,把它们作为函数的参数“使用”了一下,“骗”过了编译器,达到了与(void)var 完全相同的效果。编写代码的过程中有时会出现一些暂时用不到但又必须保留的变量,GCC等编译器会对此发出警告,使用-Wunused可以关闭这些警告消息,不过这也有可能导致潜在的隐患。ignore_unused位于名字空间boost,为了使用ignore_unused库,需要包含头文件<boost/core/ignore_unused.hpp>,即。原创 2023-08-04 11:55:43 · 129 阅读 · 0 评论 -
Boost开发指南-4.1noncopyable
注意,这里使用缺省的私有继承是允许的。但如果程序中有大量这样的类,重复写这样的代码是相当乏味的,而且代码出现的次数越多越容易增大手写出错的几率。虽然也可以用带参数的宏来减少重复,但解决方案不够优雅。因此,当我们的自定义类是noncopyable的子类时就会自动私有化父类noncopyable的拷贝构造函数,从而禁止用户从外部访问拷贝构造函数和拷贝赋值函数。一般情况下这是有用的,比如可以自动支持swap()、符合容器的拷贝语义、可以放入标准容器处理,但有的时候我们不需要类的拷贝语义,希望禁止拷贝类的实例。原创 2023-08-04 11:29:06 · 134 阅读 · 0 评论 -
Boost开发指南-3.12小结
C++11标准提供了unique_ptr、shared_ptr 和 weak_ptr,很好地减轻了程序员的内存管理负担,但没有解决所有问题,讨论了Boost关于内存管理的两个库:smart_ptr和 pool。scoped_ptr 是 smart_ptr 库中最容易学习和使用的一个,它的行为类似unique_ptr,但所有权更明确,清晰地表明了这种智能指针只能在声明的作用域中使用,不能转让,任何对它的复制企图都会失败。它不适合大多数库用户,但可以作为自行实现内存池类的一个很好的起点。原创 2023-08-02 17:32:44 · 229 阅读 · 0 评论 -
Boost开发指南-3.11pool_alloc
pool_alloc提供了两个可以用于标准容器模板参数的内存分配器,分别是pool_alloc和fast_pool_allocator,它们的行为与之前的内存池类有一点不同——当内存分配失败时会抛出异常std::bad_alloc。它们位于名字空间boost,需要包含头文件<boost/pool/pool_alloc.hpp>。除非有特别的需求,我们应该总使用标准库实现自带的内存分配器,使用pool_alloc需要经过仔细的测试,以保证它与容器可以共同工作。原创 2023-08-02 17:26:42 · 154 阅读 · 0 评论 -
Boost开发指南-3.10singleton_pool
public ://分配内存 static void * ordered_malloc();//归还内存 static void ordered_free(void * ptr);//释放内存 static bool purge_memory();原创 2023-08-02 17:19:04 · 1207 阅读 · 0 评论 -
Boost开发指南-3.9object_pool
public :public ://构造函数 ~ object_pool();//析构函数 element_type * malloc();//分配内存 void free(element_type * p);//归还内存 bool is_from(element_type * p) const;//创建对象 void destroy(element_type * p);//销毁对象 };原创 2023-08-02 16:29:45 · 244 阅读 · 0 评论 -
Boost开发指南-3.8pool
public ://构造函数 ~ pool();//析构函数 size_type get_requested_size() const;//分配块大小 void * malloc();//分配内存 void * ordered_malloc();//归还内存 void ordered_free(void * chunk);//释放内存 bool purge_memory();原创 2023-08-02 14:52:26 · 150 阅读 · 0 评论 -
Boost开发指南-3.7intrusive_ptr
public ://被代理的对象 intrusive_ptro();//构造函数 intrusive_ptr(T * p , bool add_ref = true);//重置指针 void reset(T * r);//操作符重载 T * operator ->() const;//增加引用计数 void intrusive_ptr_release(T * p);//减少引用计数。原创 2023-08-01 11:32:42 · 117 阅读 · 0 评论 -
Boost开发指南-3.6weak_ptr
/构造函数 template < class Y > weak_ptr(shared_ptr < Y > const & r);//析构函数 weak_ptr & operator =(weak_ptr const & r);//赋值 long use_count() const;//引用计数 bool expired() const;//是否失效指针 shared_ptr < T > lock() const;原创 2023-07-31 16:04:55 · 131 阅读 · 0 评论 -
Boost开发指南-3.5shared_array
public ://构造函数 template < class D > shared_array(T * p , D d);//析构函数 shared_array(shared_array const & r);//拷贝构造函数 shared_array & operator =(shared_array const & r);//拷贝赋值 void reset(T * p = 0);//重置指针 template < class D > void reset(T * p , D d);原创 2023-07-31 11:20:50 · 355 阅读 · 0 评论 -
Boost开发指南-3.4shared_ptr
public ://内部类型定义 shared_ptr();//构造函数 template < class Y > explicit shared_ptr(Y * p);//析构函数 shared_ptr(shared_ptr const & r);//拷贝构造 shared_ptr & operator =(shared_ptr const & r);原创 2023-07-24 13:20:30 · 506 阅读 · 0 评论 -
Boost开发指南-3.3scoped_array
public ://构造函数 ~ scoped_array();//析构函数 void reset(T * p = 0);//重置智能指针 T & operator [ ](std :: ptrdiff_t i) const;//重载operator[] T * get() const;//获得原始指针 explicit operator bool() const;//显式bool值转型 void swap(scoped_array & b);//交换指针 };原创 2023-07-21 17:55:49 · 113 阅读 · 0 评论 -
Boost开发指南-3.2scoped_ptr
/原始指针 scoped_ptr(scoped_ptr const &);//拷贝构造函数私有化 scoped_ptr & operator =(scoped_ptr const &);//赋值操作私有化 void operator ==(scoped_ptr const &) const;//相等操作私有化 void operator!//不等操作私有化 public ://显式构造函数 ~ scoped_ptr();原创 2023-07-18 11:10:40 · 217 阅读 · 0 评论 -
Boost开发指南-3.1smart_ptr
C++引入异常机制后,智能指针由一种技巧升级为一种非常重要的技术,因为如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码以释放资源,而智能指针则可以在退出作用域时——不管是正常流程离开或是因异常离开——总调用delete来析构在堆上动态分配的对象。为了管理内存等资源,c++程序员通常采用RAII机制(资源获取即初始化,ResourceAcquisition Is Initialization),在使用资源的类的构造函数中申请资源,然后使用,最终在析构函数中释放资源。原创 2023-07-17 15:11:03 · 98 阅读 · 0 评论 -
Boost开发指南-2.5小结
timer和 progress_timer是两个用于计时的小工具,实现原理很简单,使用了c标准中的std::clock(),精度不高但足够用。特别是progress_timer,它利用了C++中析构函数会被自动调用的特点,能够自动显示时间,用起来更方便。但如果我们需要更高精度的计时,那么应该使用timer库的另一个组件:cpu_timer。progress_display是一个可以显示程序执行进度的工具,在很耗时的应用程序中可以给出友好的进度提示,使用也很容易。原创 2023-07-14 11:51:54 · 186 阅读 · 0 评论 -
Boost开发指南-2.4posix_time
从概念上来说,(广义的)时间是日期的进一步细化,相当于在日期“天”的量级下增加了时分秒的分辨率,因此,我们首先介绍时间长度time_duration类,它表述了时分秒的度量,然后再介绍时间点ptime 类。date_time 库在格里高利历的基础上提供徼秒级别的时间系统,但如果需要,它最高可以达到纳秒级别的精确度。原创 2023-07-12 19:16:24 · 301 阅读 · 0 评论 -
Boost开发指南-2.4date_time
时间点和时长都有无限的值,它们的运算规则比较特别,例如+ oo时间点+时长=+∞时间点,时间点+∞时长=+∞时间点。时间点、时间段和时长三者之间可以进行运算,例如时间点+时长=时间点,时长+时长=时长,时间段∩时间段=时间段、时间点∈时间段等等,但有的运算也是无意义的,如时间点+时间点、时长+时间段等等。如果把时间想象成一个向前和向后都无限延伸的实数轴,那么时间点就是数轴上的一个点,时间段就是两个时间点之间确定的一个区间,时长(时间长度)则是一个有正负号的标量,它是两个时间点之差,不属于数轴。原创 2023-05-29 18:44:02 · 695 阅读 · 0 评论 -
Boost开发指南-2.3progress_display
public :progress_display的构造函数接受一个long型的参数expected_count,表示用于进度显示的基数,是最常用的创建progress_display的方法。另一种形式的构造函数除了基数和流输出对象外,还接受三个字符串参数,定义显示的三行首字符串。但这个构造函数有点小问题,流输出对象通常都应该是cout,把进度输出到文件或者其他用户看不到的地方似乎没有多大的意义。原创 2023-05-20 13:21:48 · 702 阅读 · 0 评论 -
Boost开发指南-2.2progress_timer
public :progress_timer继承自timer,因此它的接口与timer相同,也很简单。唯一需要注意的是构造函数,它允许将析构时的输出定向到指定的 IO 流里,默认是std::cout。如果有特别的需求,可以用其他标准库输出流替换,或者用重定向cout的输出。//一个字符串流对象 {//要求progress_timer输出到ss中 } //progress_timer在这里析构,自动输出时间 cout原创 2023-05-19 10:20:01 · 366 阅读 · 0 评论 -
Boost开发指南-2.1timer
timer类可以测量时间的流逝,是一个小型的计时器,提供毫秒级别的计时精度和操作函数,供程序员手工控制使用,就像是个方便的秒表。原创 2023-05-18 19:15:40 · 547 阅读 · 0 评论