• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    6年前 (2013-04-25)  STL |   2 条评论  18 
    文章评分 0 次,平均分 0.0

    介绍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类似。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/830.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享