深入实践boost读书笔记1

来源:互联网 发布:知乎补充回答 编辑:程序博客网 时间:2024/05/23 22:57

秘籍2:boost::any中可以存储任意值,使用类型擦除技术,boost::any在对类型T赋值时候构造一个可以存储类型T的值,这个值派生之一个内部基类占位符类型,占位符拥有std:type_info和用于克隆一个存储类型的虚函数,当any_cast使用时,boost::any检查std:type_info是否等于typeid(T)。boost::any需要调用动态类存分配函数,需要使用RTTI和大量的虚函数,目前性能不佳。

秘籍3:boost::variant类持一个数组并在数组中存入值,数组大小在编译时确定,对boost::variant赋值或者构造时,以前的就地销毁并且在字符数组的顶端构造新值。boost::variant不需要在堆中分配内存,不需要启用RTTI,执行速度非常快。要达到最佳性能,需要确保在支持的类型列表中有一个简答类型,并且这个类型位于第一个位置。

秘籍4:boost.variant库实现了一个访客编程模式来访问存储的数据,比boost.get<>()安全多了,这种模式迫使程序员处理好每个变体类型,否则编译失败。通过boost::apply_visitor函数使用这个模式,函数第一个参数时访客函数化对象(派生自boost::static_visitor<T>,必须为变体中每个类型重载operator()),第二个参数为一个变体。boost.variant库在编译时产生类似于switch语句的跳转,从而实现正确operator() 的调用。

秘籍9:boost::bind函数返回一个函数化对象,它存储绑定值的副本和原有的函数化对象,当实际的operator()调用执行时,存储的参数和调用时传递的参数一起被传递到函数化对象。当绑定时,需要赋值一个值到函数化对象,boost.ref可以避免复制。boost::ref()和boost::cref()可以构造一个reference_wrapper<T>和reference_wrapper<const T>类型的对象,不需要动态分配内存,不需要使用虚函数。

秘籍10:使用c++11的右值引用和转移语义。减少临时对象的构造和复制。

秘籍11,12:使用boost::lexical_cast<T>()函数实现字符串和数值之间的转换。字符换转化成数值时boost::lexical_cast还会检查边界,越界会抛出异常。

秘籍13:使用boost::numeric_cast实现数值之间的转换。数值转换时丢失数据时会抛出异常。

秘籍14:boost::lexical_cast函数可以检测并使用流操作符来转换用户定义类型。

秘籍17:boost::polymorphic_cast函数会检查输入是否为空,然后试图做一个动态转换,出现任何错误会抛出std::bad_cast异常。boost::polymorphic_downcast在调试模式下使用dynamic_cast,非调试模式下使用static_cast,适用于对性能要求严格的地方。

秘籍18:boost::spirit允许直接用c++代码的格式编写解析器,boost::spirit的语法和扩展巴克斯范式(EBNF)非常接近。spirit内容很多,用时需要多度学习。

秘籍20,21:scoped_ptr不可复制,只存储一个类指针。shared_ptr有引用计数功能,make_shared函数构造shared_ptr速度更快,因为shared_ptr普通构造需要两次构造函数(一个时new对象,一个是shared_ptr中new的原子计数器),而make_shared只需要一次new调用,它将分配一块内存并在其上构造哟个原子计数器和对象。

秘籍22:scoped_array可以用来管理new数组指针。shared_array同样具有引用计数功能,make_shared同样较快。

秘籍23:boost::function使用类型擦除技术,经过了很多优化,可以存储小的函数化对象,而无须额外的内存分配并且拥有优化的移动赋值运算符,但是boost::function意味着编译器的优化障碍,所以不是真的需要就不要使用boost::function,c++ 11  auto关键字就能方便的替换它。

秘籍27:boost拥有ptr_vector、ptr_array、ptr_set、ptr_multimap类和其他类,自动管理new对象。

秘籍28:使用boost::scopeexit可以达到java里面的try{}finally{}效果,实现在退出作用域时候执行一些工作,“BOOST_SCOPE_EXIT(f)”与“BOOST_SCOPE_EXIT_END”之间的代码将被执行。希望按引用传值在BOOST_SCOPE_EXIT使用&符号,多个值用逗号隔开。

秘籍30:static_assert可以进行编译时断言。

0 0
原创粉丝点击