STL内存基本内存处理工具

2013年4月25日 由 Creater 留言 »

介绍5个底层相关的内存处理工具.
construct,destroy,uninitialized_copy,uninitialized_fill_n,uninitialized_fill.
首先是uninitialized_copy,该模板函数针对char,wchar_t进行了特化,使用memmove提高处理效率。
该函数用于将输入区间元素拷贝到输出区间。

template <class InputIterator, class ForwardIterator>
inline ForwardIterator
  uninitialized_copy(InputIterator first, InputIterator last,
                     ForwardIterator result) {
  return __uninitialized_copy(first, last, result, value_type(result));
}

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);
}

其中针对元素是否是平凡的[拷贝构造函数,默认构造函数,赋值操作符与析构函数],进行不同处理。
参数value_type(result),用于获取元素的类型,通过该类型来获取是否平凡,以下利用__type_traits::is_POD_type来对T进行判断。

template <class InputIterator, class ForwardIterator, class T>
inline ForwardIterator
__uninitialized_copy(InputIterator first, InputIterator last,
                     ForwardIterator result, T*) {
  typedef typename __type_traits<T>::is_POD_type is_POD;
  return __uninitialized_copy_aux(first, last, result, is_POD());
}

根据不同的元素平凡性来进行分别处理

template <class InputIterator, class ForwardIterator>
inline ForwardIterator 
__uninitialized_copy_aux(InputIterator first, InputIterator last,
                         ForwardIterator result,
                         __true_type) {
  return copy(first, last, result);
}

template <class InputIterator, class ForwardIterator>
ForwardIterator 
__uninitialized_copy_aux(InputIterator first, InputIterator last,
                         ForwardIterator result,
                         __false_type) {
  ForwardIterator cur = result;
  __STL_TRY {
    for ( ; first != last; ++first, ++cur)
      construct(&*cur, *first);
    return cur;
  }
  __STL_UNWIND(destroy(result, cur));
}

第一个为平凡元素,则可以直接调用高层copy函数。
第二个为非平凡元素,则需要对每个元素进行构造。
其他函数也一样,uninitialized_fill_n,uninitialized_fill类似。

广告位

发表评论

你必须 登陆 方可发表评论.