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

  • 相关阅读:
    JS组件系列——表格组件神器:bootstrap table
    wcf寄宿到iis
    win10获取注册表权限
    在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项
    从TFS中的现有项目复制一份作为新项目,导致提交的服务器无法加载
    对程序集“”签名时加密失败 --“对程序集签名时出错
    session
    升级webapi依赖的Newtonsoft.json的版本(转)
    多线程相关
    Linq Group By 多个字段
  • 原文地址:https://www.cnblogs.com/JackyTecblog/p/2634759.html
Copyright © 2020-2023  润新知