博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcpy memmove区别和实现
阅读量:4985 次
发布时间:2019-06-12

本文共 1027 字,大约阅读时间需要 3 分钟。

memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

memmove的处理措施:

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝

(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

-- memcpy实现

void* memcpy(void* dest, const void* src, size_t n)  {     char*      d = (char*) dest;     const char*  s = (const char*) src;     while(n-–)         *d++ = *s++;     return dest; }

 

-- memmove实现

void* memmove(void* dest, const void* src, size_t n) {     char*     d  = (char*) dest;     const char*  s = (const char*) src;        if (s>d)      {          // start at beginning of s          while (n--)             *d++ = *s++;     }     else if (s

示意图:

(1)内存低端 <-----s-----> <-----d-----> 内存高端 start at end of s (2)内存低端 <-----s--<==>--d----->      内存高端 start at end of s (3)内存低端 <-----sd----->              内存高端 do nothing (4)内存低端 <-----d--<==>--s----->      内存高端 start at beginning of s (5)内存低端 <-----d-----> <-----s-----> 内存高端 start at beginning of s

 

转载于:https://www.cnblogs.com/lihaozy/p/3381899.html

你可能感兴趣的文章
监听器的使用,以及实现, 测试
查看>>
eCharts 折线图,动态绑定数据不更新图表的问题,
查看>>
java基础二 分支循环
查看>>
python--002--数据类型(list、tuple)
查看>>
把近期的小错误整理一下
查看>>
C# 将dataset数据导出到excel中
查看>>
动画浅析-CAAnimation和CATransition
查看>>
[JSOI2008]星球大战
查看>>
自己看过的前端书籍
查看>>
MVC之自定义过滤器(ActionFilterAttribute)
查看>>
WEB环境搭建(tomcat)、Eclipse连接tomcat
查看>>
Linux下向SVN服务器添加新文件步骤
查看>>
深入分析CAS
查看>>
2017-11-6 Django
查看>>
图像处理中的matlab使用
查看>>
动态规划 —— 背包问题一 专项研究学习
查看>>
51nod 1571 最近等对 | 线段树 离线
查看>>
关于parseInt的看法
查看>>
从用户端到后台系统,严选分销教会我这些事
查看>>
数据分析融入至BI工具的新思路
查看>>