boostpressed_pair源码剖析

上传人:m**** 文档编号:559579319 上传时间:2023-05-07 格式:DOC 页数:6 大小:73.50KB
返回 下载 相关 举报
boostpressed_pair源码剖析_第1页
第1页 / 共6页
boostpressed_pair源码剖析_第2页
第2页 / 共6页
boostpressed_pair源码剖析_第3页
第3页 / 共6页
boostpressed_pair源码剖析_第4页
第4页 / 共6页
boostpressed_pair源码剖析_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《boostpressed_pair源码剖析》由会员分享,可在线阅读,更多相关《boostpressed_pair源码剖析(6页珍藏版)》请在金锄头文库上搜索。

1、pressed_pair源码剖析意义当compressed_pair的某一个模板参数为一个空类的时候将对其进行“空基类优化”,这样可以使得compressed_pair占用的空间比std:pair的更小。参考如下代码:#include using namespace std;#include class A;class B;int main() cout sizeof( std:pair ) endl;cout sizeof( boost:compressed_pair ) endl;return 0;在我的机器上,VC2008 SP1输出2和1。std:pair参考std:pair被实现为一

2、个结构体,其中VC2008 SP1的pair被实现为如下:templatestruct pair/ store a pair of valuestypedef pair _Myt;typedef _Ty1 first_type;typedef _Ty2 second_type;pair(): first(_Ty1(), second(_Ty2()/ construct from defaultspair(const _Ty1& _Val1, const _Ty2& _Val2): first(_Val1), second(_Val2)/ construct from specified val

3、uestemplatepair(const pair& _Right): first(_Right.first), second(_Right.second)/ construct from compatible pair/ 删除了一些不重要的代码_Ty1 first;/ the first stored value_Ty2 second;/ the second stored value;通过直接访问first和second对数据进行访问。pressed_pair参考pressed_pair大概的实现如下:class compressed_pairpublic: typedef T firs

4、t_type; typedef T second_type; typedef typename call_traits:param_type first_param_type; typedef typename call_traits:param_type second_param_type; typedef typename call_traits:reference first_reference; typedef typename call_traits:reference second_reference; typedef typename call_traits:const_refe

5、rence first_const_reference; typedef typename call_traits:const_reference second_const_reference; first_reference first() return base:first(); first_const_reference first() const return base:first(); second_reference second() return base:second(); second_const_reference second() const return base:se

6、cond(); void swap(:boost:compressed_pair& y) base:swap(y); ;注意这不是完整的代码,它只是对其实现的一个简单描述。从中我们可以看出pressed_pair使用成员函数来访问数据而不是如std:pair一样直接访问first和second。pressed_pair剖析 pressed_pair的实现依赖于boost.type_traits和boost.call_traits。boost.type_traits是boost提供的一个特征类库,这是一个强大的库,可以应用于很多地方。boost的大量组件都依赖于它。boost.call_trai

7、ts也是一个类似于type_traits的库,它主要提供的是一些类型调整,通过编译器演绎我们可以在编译时得到最好的type,它可以使我们的传递的参数等等相关内容总是以最恰当(根据经验)的方式来进行调用,而且还能在新的C+标准发布之前绕过“引用的引用”问题。接下来我将剖析支持偏特化版本的compressed_pair的实现,它位于boostdetailcompressed_pair.hpp。compressed_pair_switch这是一个开关工具,用于在后面对各种情况进行开关控制,它的基本实现如下:template struct compressed_pair_switch;注意,它只是定义

8、而非实现,因此我们无法构造未特化过的compressed_pair_switch。通过查看它的模板参数可以知道后面三个bool代表了三个概念:l pair的两个模板参数是否是相同类型。(去掉cv限定符之后)。l 第一个模板参数是空的吗?l 第二个模板参数是空的吗?因此对这三个bool进行有限组合可以得到6种组合,也就出现了接下来我们所看到的6个特化(偏特化)。template struct compressed_pair_switch static const int value = 0; template struct compressed_pair_switch static const

9、int value = 3; template struct compressed_pair_switch static const int value = 1; template struct compressed_pair_switch static const int value = 2; template struct compressed_pair_switch static const int value = 4; template struct compressed_pair_switch static const int value = 5;现在我们已经偏特化了6个不同的开关,

10、它们将在最终实现compressed_pair的过程中发挥巨大的作用。注意每个类中的value,这个常量值代表了它的版本。compressed_pair_imp它作为最终compressed_pair的基类存在,它的声明如下:template class compressed_pair_imp;注意第三个参数Version,在最终的实现中它将被以compressed_pair_switch:value来具现化。接下来按照compressed_pair_switch的6种版本所说明的6中组合情况分别实现其对应的compressed_pair_imp。在文章最开始的时候我们的简单程序发现std:p

11、air由于直接采用组合T1、T2而无法使之成功的应用“空基类优化”,使得其占用空间的大小是2.如果compressed_pair_imp也直接按照这种组合来实现的话,那么所谓“压缩”便不会有任何意义。所以compressed_pair_imp对应不同组合情况有不同的实现,比如说对于版本1:template struct compressed_pair_switch static const int value = 1;这种情况便是指T1和T2在去cv限定符之后为不同类型,且第一种类型为空,第二种不为空,那么这时候在实现compressed_pair_imp的时候便取消了T1的数据,源码如下:template class compressed_pair_imp : protected :boost:remove_cv:type public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits:param_type

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号