stl copy函数的实现真相总结

copy()算法可将输入区间[first,last)内的元素复制到输出区间[result,result+(last-first))内。也就是说,它会执行赋值操作,即:*result=*first,*(result+1)=*(first+1),...依此类推。

 

而无论在客户端还是针对stl内部实现而言,copy()都是一个常常被调用的函数。由于copy()进行的是复制操作,而复制操作不外乎运用assignment operator或者 copy constructor(copy算法用的是前者),但是某些元素型别拥有的是trival assignment operator,因此,如果能使用内存直接复制行为(例如C标准函数memove或者memcpy),便能节省大量操作时间。为此,stl的copy算法用尽了各种办法,包括函数重载,型别特征,偏特征化等编程技巧,无所不用其极地加强效率。下图表示的就是整个copy()操作的脉络。理解了下图,对copy()算法内部的实现技巧也就有了一个整体的认识和把握呢。

 

1

(上图中的memove()函数名应该更改为memmove())

 

在这里我们顺便区分下memmove()与memcpy()函数的区别。

由于memmove()方法在实现内存移动过程中是首先将源内存块(待移动的内存块)内容先拷贝一份,然后再将其移动到目的内存块中,这样的话即使目的内存块和源内存块存在重叠情况也不会出现问题。

而memcpy()方法却不会先执行拷贝源内存块内容,而是直接在源内存块中进行内存块内容拷贝操作,故当源内存块和目的内存块存在重叠的情况时,在复制的过程中就会出现覆盖的情况,导致结果错误。

 

以上便是memmove()与memcpy()的最主要的区别。不过在window下,好像区别不大,但是在linux下确有着很大的不一样。自己可以验证下。以下为memmove()函数原型,memcpy()函数原型一样:

void *memmove(void *dest, const void *src, size_t n);

posted @ 2012-08-12 16:21  JackyBing  阅读(1885)  评论(0编辑  收藏  举报