【STL源码剖析】__type_traits技法
来源:互联网 发布:淘宝自制护肤品北海 编辑:程序博客网 时间:2024/05/17 15:22
上篇介绍了__iterator_traits编程技法,SGI 将这种技法进一步扩大到迭代器以外,于是有了所谓的__type_traits。
iterator_traits负责萃取迭代器的特性,__type_traits则负责萃取型别的特性。
而这里我们关注的型别特性是指:这个型别是否具备non-trivial default ctor\non-trivial copy ctor\ non-trivial assignment\non-trivial dtor?根据型别我们就可以进行构造、析构、拷贝、赋值最有效率的措施,例如根本不调用那些身居高位、不谋其事的那些ctor、dtor,而采用内存直接处理操作如malloc()、memcpy()等等,获得最高效率,在大规模而操作频繁的容器有着显著的效率提升。
关于怎样是trivial(没用的)\non-trivial(有用的),可以看《深入探索C++对象模型》。
SGI STL内部有定义:
template<class type>struct __type_traits{typedef __true_type this_dummy_member_must_be_first;typedef __false_type has_trivial_default_constructor;typedef __false_type has_trivial_copy_constructor;typedef __false_type has_trivial_assignment_operator;typedef __false_type has_trivial_destructor;typedef __false_type is_POD_type;};struct __false_type{};struct __true_type{};
还有一些对内置类型的特例化版本,上面是保守的定义,设计了自己的类后,要特例化自己的版本:
class MyClass{};template<>struct __type_traits<MyClass>{typedef __true_type has_trivial_default_constructor;typedef __false_type has_trivial_copy_constructor;typedef __false_type has_trivial_assignment_operator;typedef __false_type has_trivial_destructor;typedef __false_type is_POD_type;};
通过__false_type/__true_type来判别是否具备有用的构造、析构、赋值、复制函数。
那么,SGI STL是如何在算法中应用的呢?看下面,以算法函数uninitialized_fill_n为例:
template<class ForwardIterator, class Size, class T>inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T& x){ return __uninitialized_fill_n(first, n, x, value_type(first));}template<class ForwardIterator, class Size, class T, class T1>inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n, const T& x, T1*){ typedef typename __type_traits<T1>::is_POD_type is_POD; return __uninitialized_fill_n(first, n, x, is_POD());}template<class ForwardIterator, class Size, class T>inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first, Size n, const T& x, __false_type){ for (;n > 0; --n,++cur) construct(&*cur, x); return cur;}template<class ForwardIterator, class Size, class T>inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first, Size n, const T& x, __true_type){ return fill_n(first, n, x);}template<class OutputIterator, class Size, class T>OutputIterator fill_n(OuputIterator first, Size n, const T& value){ for (;n > 0;--n) *first = value; return first;}
value_type是萃取元素类型的函数,也是模板实现,
construct底层高效率调用,不是使用构造函数
上面就是__type_traits了。
0 0
- 【STL源码剖析】__type_traits技法
- 《STL源码剖析》traits技法
- 【STL源码剖析】__iterator_traits技法
- stl源码剖析之traits编程技法
- 《STL源码剖析》traits技法分析
- STL源码分析之__type_traits
- 《STL源码剖析》学习笔记2——神奇的__type_traits
- STL源码剖析笔记四--迭代器与traits技法
- STL源码剖析(二) - 迭代器与traits技法
- 《stl源码剖析》-- 迭代器概念和trait编程技法
- STL源码剖析-迭代器概念与traits编程技法
- STL源码剖析——type traits编程技法
- 《STL源码剖析》读书笔记------第3 章 迭代器概念与traits编程技法
- 《STL 源码剖析读书笔记(一)》-----迭代器概念与trais编程技法
- STL源码剖析_读书笔记:第三章 迭代器概念与traits编程技法
- STL源码剖析 迭代器(iterator)概念与编程技法(三)
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(一)
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(二)
- 上帝与集合的正确用法 [Bzoj 3884]
- CentOS上安装Mplayer播放器
- java.util.Arrays类
- Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框
- C#winform直接连接SQL数据库mdf文件
- 【STL源码剖析】__type_traits技法
- stm32 学习经历—环境搭建 以103 407搭建 3/1
- matlab GUI 设计
- javascript中引用数据类型
- GenyMotion无法下载或无法登录
- 【Android】Parse 开发
- Eclipse打包apk报错原因分析(一)
- [jvm解析系列][二]Java堆的详细讲解和对象的分配过程和访问
- 有效处理Java异常的三个原则,你知道吗?