深度剖析空间配置器(三)内存处理函数
来源:互联网 发布:韩端机器人编程软件 编辑:程序博客网 时间:2024/06/07 11:29
空间配置器
主要分三个文件实现,我们已经介绍过第一个文件了(对象的构造和析构 http://blog.csdn.net/hj605635529/article/details/70238270),
第二个(http://blog.csdn.net/hj605635529/article/details/70238728 一二级配置器)
现在我们来介绍第三个文件 stl_uninitialized.h 这里定义了一些全局函数,用来填充(fill)或复制(copy)大块内存数据
uninitialized_copy(),uninitialized_copy_n(),uninitialized_fill(),uninitialized_fill_n() (由函数名可知,是对未初始化空间的初始化操作,即通过复制或赋值的方式初始化未初始化的空间)
先学习 uninitiated_copy()
-
-
- inline char* uninitialized_copy(const char* __first, const char* __last, char* __result)
- {
- memmove(__result, __first, __last - __first);
- return __result + (__last - __first);
- }
-
- inline wchar_t*
- uninitialized_copy(const wchar_t* __first, const wchar_t* __last, wchar_t* __result)
- {
- memmove(__result, __first, sizeof(wchar_t)* (__last - __first));
- return __result + (__last - __first);
- }
上面两个是对两种特化类型的处理,下面为泛化版本- template <class _InputIter, class _ForwardIter>
- inline _ForwardIter
- uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result)
- {
-
- return __uninitialized_copy(__first, __last, __result, __VALUE_TYPE(__result));
- }
-
- template <class _InputIter, class _ForwardIter, class _Tp>
- inline _ForwardIter
- __uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result, _Tp*)
- {
- typedef typename __type_traits<_Tp>::is_POD_type _Is_POD;
-
-
- return __uninitialized_copy_aux(__first, __last, __result, _Is_POD());
- }
-
-
- template <class _InputIter, class _ForwardIter>
- inline _ForwardIter
- __uninitialized_copy_aux(_InputIter __first, _InputIter __last, _ForwardIter __result, __true_type)
- {
-
- return copy(__first, __last, __result);
-
-
-
-
-
-
-
-
- }
-
-
- template <class _InputIter, class _ForwardIter>
- _ForwardIter
- __uninitialized_copy_aux(_InputIter __first, _InputIter __last, _ForwardIter __result, __false_type)
- {
- _ForwardIter __cur = __result;
-
-
- __STL_TRY{
- for (; __first != __last; ++__first, ++__cur)
- _Construct(&*__cur, *__first);
- return __cur;
- }
-
-
- __STL_UNWIND(_Destroy(__result, __cur));
-
- }
POD就是标量型别或传统的C struct 型别,POD 型别必然拥有 trivial ctor / dtor / copy / assignment 函数,因此我们可以对POD型别进行判断,从而决议出最有效率的初值填写手法
不难发现上面 uninitiated_copy() 后,返回的是指向 copy 后的区块末端。
uninitiated_copy_n() 则是向指定欲初始化空间初始化(复制)指定大小已初始化空间的指定值(有点拗口)。
- template <class _InputIter, class _Size, class _ForwardIter>
- inline pair<_InputIter, _ForwardIter>
- uninitialized_copy_n(_InputIter __first, _Size __count, _ForwardIter __result)
- {
-
- return __uninitialized_copy_n(__first, __count, __result, __ITERATOR_CATEGORY(__first));
- }
-
-
-
- template <class _RandomAccessIter, class _Size, class _ForwardIter>
- inline pair<_RandomAccessIter, _ForwardIter>
- __uninitialized_copy_n(_RandomAccessIter __first, _Size __count, _ForwardIter __result, random_access_iterator_tag)
- {
- _RandomAccessIter __last = __first + __count;
- return pair<_RandomAccessIter, _ForwardIter>(__last, uninitialized_copy(__first, __last, __result));
- }
-
-
- template <class _InputIter, class _Size, class _ForwardIter>
- pair<_InputIter, _ForwardIter>
- __uninitialized_copy_n(_InputIter __first, _Size __count, _ForwardIter __result, input_iterator_tag)
- {
-
-
- _ForwardIter __cur = __result;
- __STL_TRY{
- for (; __count > 0; --__count, ++__first, ++__cur)
- _Construct(&*__cur, *__first);
- return pair<_InputIter, _ForwardIter>(__first, __cur);
- }
- __STL_UNWIND(_Destroy(__result, __cur));
- }
上面函数都是返回 pair 对组类型。其实就是返回两个值,一个是 “只读” 型别的迭代器(_InputIter),一个是允许 “写入型” 的迭代器(_ForwardIter)。
下面这个函数 uninitiated_fill() 和 uninitiated_copy() 操作很像,只不过前者是赋值,后者是复制。-
-
- template <class _ForwardIter, class _Tp>
- inline void uninitialized_fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __x)
- {
- __uninitialized_fill(__first, __last, __x, __VALUE_TYPE(__first));
- }
-
-
- template <class _ForwardIter, class _Tp, class _Tp1>
- inline void __uninitialized_fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __x, _Tp1*)
- {
- typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD;
- __uninitialized_fill_aux(__first, __last, __x, _Is_POD());
- }
-
- template <class _ForwardIter, class _Tp>
- inline void
- __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, const _Tp& __x, __true_type)
- {
- fill(__first, __last, __x);
-
-
-
-
-
-
-
-
- }
-
- template <class _ForwardIter, class _Tp>
- void
- __uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, const _Tp& __x, __false_type)
- {
- _ForwardIter __cur = __first;
- __STL_TRY{
- for (; __cur != __last; ++__cur)
- _Construct(&*__cur, __x);
- }
- __STL_UNWIND(_Destroy(__first, __cur));
- }
下面的函数 uninitiated_fill_n() 则是向指定欲初始化空间初始化(赋值)指定大小空间的指定值。- template <class _ForwardIter, class _Size, class _Tp>
- inline _ForwardIter
- uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x)
- {
- return __uninitialized_fill_n(__first, __n, __x, __VALUE_TYPE(__first));
- }
-
- template <class _ForwardIter, class _Size, class _Tp, class _Tp1>
- inline _ForwardIter
- __uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x, _Tp1*)
- {
- typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD;
- return __uninitialized_fill_n_aux(__first, __n, __x, _Is_POD());
- }
-
- template <class _ForwardIter, class _Size, class _Tp>
- _ForwardIter
- __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n, const _Tp& __x, __false_type)
- {
- _ForwardIter __cur = __first;
- __STL_TRY{
- for (; __n > 0; --__n, ++__cur)
- _Construct(&*__cur, __x);
- return __cur;
- }
- __STL_UNWIND(_Destroy(__first, __cur));
- }
-
- template <class _ForwardIter, class _Size, class _Tp>
- inline _ForwardIter
- __uninitialized_fill_n_aux(_ForwardIter __first, _Size __n, const _Tp& __x, __true_type)
- {
- return fill_n(__first, __n, __x);
-
-
-
-
-
-
-
-
-
- }
0 0