STL 简单 copy 算法的实现

本文详细介绍了STL中的copy算法,探讨了如何通过优化迭代器类型、赋值运算符特性和内存复制来提升复制性能。文章提供了一个在VS2013下实现的版本,并列举了涉及的头文件,包括cghStl_algobase.h、cghUtil.h、cghSTL_type_traits.h、cghSTL_iterator.h等。测试部分涵盖了原生指针、trivial和non-trivial赋值运算符以及InputIterator和RandomAccessIterator的性能比较。
摘要由CSDN通过智能技术生成

1.简介

         不论是对客户端或对STL内部而言,copy() 都是一个常常被调用的函数。由于copy进行的是复制操作,而复制操作不外乎运用赋值运算符(assignment operator)或复制构造函数(copy constructor),但是某些元素的类型是trivial assignment operator,因此如果能使用内存直接进行复制(例如使用C标准函数memmove、memcpy),便能节约大量时间。为此,copy算法用尽各种办法,包括函数重载(function overloading)、型别特性(type traits)、偏特化(partial specialization)等编程技巧来加强效率。

         copy算法可将输入区间 [first, last ) 内的元素复制到输出区间 [ result, result + ( last – first ) )内,并返回迭代器:result + (last – first ) 。copy对template参数所要求的条件非常宽松,输入区间有InputIterator 构成,输出由OutputIterator 构成。

 

         由上图可知,copy算法从以下方面强化复制性能:

1.      迭代器指针类型,一般分为对象指针和原生指针。原生指针可直接使用memmove方式进行拷贝。像memmove这里的底层库函数,在汇编层面上做了优化,复制速度极快,有兴趣的童鞋请自行查阅相关资料;

2.      赋值运算符(assignment operator)类型,指针指向的对象,其赋值运算符可以分为trivial operator和non-trivial operator(trivial 和non-trivial 的概念请移步:stack overflowCSDN),trivial 赋值运算符之间调用memmove,non-trivial的比较悲剧,只能挨个复制;

3.      迭代器类型,分为InputIterator、RandomAccessIterator。InputIterator类型的需要由迭代器来判断复制结束,我们知道,判断iter != contianer.end()需要调用operator!=重载函数,速度慢。RandomAccessIterator以距离是否相等来决定复制结束,速度较快。

 

2.设计与实现

我用VS2013写的程序(github),数值算法的实现版本的位于cghSTL/version/cghSTL-0.5.2.1.rar

本文介绍的算法实现需要以下文件:

1.    cghStl_algobase.h,本文的主角:算法的源码,位于cghSTL/algorithms/

2.    cghUtil.h:包含copy算法用到的memmove算法,位于cghSTL/cghUtil/

3.    cghSTL_type_traits.h,特性萃取机,可以判断对象是否为trivial或non-trivial;

4.    cghSTL_iterator.h,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值