SGI STL中的copy算法
在stl中,copy是一个调用非常频繁的函数,而这些操作又涉及到了各种的内存操作——运用assignment operator或者copy constructor。为了提高效率,对于拥有trivial assignment operator的元素类型,可以使用直接的内存复制(例如C库函数——memmove或者memcpy)。
copy算法脉络:
在这里有一个需要注意的问题,就是由于copy算啊是将输入区间内的元素复制到输出区间中,因此当输入区间与输出区间重叠的时候很有可能出现问题。
这里出现问题的原因是由于deque的迭代器不是原生指针,如果使用的是vector,迭代器是原生指针,调用copy算法后会以memmove执行实际的复制操作,这样整块内存进行复制就不会出错。
但是这个在我的机器上运行是正确的
gcc version 5.4.0
1 |
|
我们还是回到SGI的STL吧,以下是唯一的对外接口:
1 | template <class InputIterator, class OutputIterator> |
另外,会有两个重载函数,针对原始指针——const char和const wchar_t,进行内存直接拷贝操作:
1 | inline char* copy(const char* first, const char* last, char* result) |
接下来,我们看一下copy()函数中调用的__copy_dispatch():
1 | template <class InputIterator, class OutputIterator> |
先来看看泛化版本的**__copy_dispatch调用的** 函数**__copy**,该函数针对不同类型的迭代器使用的循环条件不同:
1 | template <class InputIterator, class OutputIterator> |
接下来是__copy_d的实现:
1 | template <class RandomAccessIterator, class OutputIterator, class Distance> |
回到__copy_dispatch的偏特化版本中,这个函数里面调用 __copy_t()
1 | template <class T> |
即便自定义的class C具备trivial operator=,它仍然可能被判断__false_type,这是因为<type_triais.h>中只针对某些类型做了记录。