void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。

方案一:没有考虑重复,不太好

void *mymemcpy(void *dst,const void *src,size_t num)
{assert((dst!=NULL)&&(src!=NULL));//assert(des>=src+num||src>dst+num);byte * psrc = (byte *)src;//byte 既为unsigned char类型byte * pdst = (byte *)dst;while(num-->0)*pdst++ = *psrc++;return dst;
}

方案二:考虑重复情况

代码中,无论谁在前在后,如果保证调用函数后,两个字符串都能用,就必须加上两个重复判断!

void* memcpy(void *dst, const void *src, size_t count)
{      //安全检查  assert( (dst != NULL) && (src != NULL) );      unsigned char *pdst = (unsigned char *)dst;      const unsigned char *psrc = (const unsigned char *)src;      //防止内存重复  assert(!(psrc<=pdst && pdst<psrc+count));      assert(!(pdst<=psrc && psrc<pdst+count));      while(count--)      {      *pdst = *psrc;      pdst++;      psrc++;      }      return dst;
}    

方案三:如果有重复,也会进行复制,但要注意,传入的指针是void类型的,一定要转换成char *类型!

void * mymemcpy(void *dest, const void *src, size_t count)
{if (dest == NULL || src == NULL)return NULL;char *pdest = static_cast <char*>(dest);const char *psrc  = static_cast <const char*>(psrc);int n = count;if (pdest > psrc && pdest < psrc+count){for (size_t i=n-1; i != -1; --i){pdest[i] = psrc[i];}}else{for (size_t i= 0; i < n; i++){pdest[i] = psrc[i];}}return dest;
}
void * my_memcpy(void *dst,const void *src,unsigned int count)
{assert(dst);assert(src);void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝{while(count--){*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else                        //源地址和目的地址重叠,高字节向低字节拷贝{ dst = (char *)dst + count - 1;src = (char *)src + count - 1; while(count--) {*(char *)dst = *(char *)src;dst = (char *)dst - 1;src = (char *)src - 1;}}return ret;
}

memcpy函数实现及其优化相关推荐

  1. memcpy函数优化及DMA对比

    一.背景与目的 优化算法结构,提高芯片的使用效率,挖掘芯片的潜在能力,对提高产品质量,降低产品成本有着重要意义,在性能受限的嵌入式设备更加重要. 在使用C语言编程时,我们常用memcpy来复制内存数据 ...

  2. memcpy函数_[PART][BUG][MSVCRT][C][CCF NOI1097] 关于memcpy的坑

    [Incompleted] CCF NOI1097 试题,本人的源码: Ubuntu Pastebin​paste.ubuntu.com Ubuntu Pastebin Ubuntu Pastebin ...

  3. resize函数查表优化

    接着OpenCV的resize函数优化写,对于输入输出图像大小已知,且通道数相同的resize操作,可以使用查表的方法来进行优化,先生成输出图像中每个点对应原图的位置,然后拷贝原图像素点到目标图像. ...

  4. memcpy函数与memmove函数

    1.1 memcpy函数是C语言内存拷贝函数,功能是从原内存地址的起始位置开始依次拷贝若干个字节到从目标地址的起始位置开始依次向后的若干个字节中. void* memcpy(void* dest,co ...

  5. memcpy 函数实现

    memcpy函数的作用: 将由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回一个指向dest的指针. 想必大多数人在面试时被要求写 memcpy的实现 ...

  6. C++实现memcpy函数

    实现memcpy函数 首先是函数接口的实现: void mymemcpy(void* dst, const void* src, size_t num) 这里使用了void*作为指针类型,接口更加通用 ...

  7. memcpy()函数

    1.memcpy()函数的实现 void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开始拷贝n个字节到目标des ...

  8. 最保险的函数间数组作为参数值传递与返回方法,用memcpy函数

    举例代码如下: void mycvCalcHist(IplImage *img,double out_hist[256]) {int i=0, j=0; double temp1=0;int temp ...

  9. 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug

    0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如: #define memcpy(dst,src,n) \     __asm__("cld;rep;movs ...

最新文章

  1. 泛前端知识图谱(Web/iOS/Android/RN)
  2. 一次 MySQL 千万级大表的优化过程
  3. ThinkPHP 模板循环输出 Volist 标签
  4. 读-福瑞哈哥-的POE学习笔记
  5. 推荐两个Firefox插件
  6. Navicat使用教程:在Navicat Monitor for MySQL/MariaDB中配置实
  7. ASC0106硬件连接注意事项
  8. 第三届山东大数据-威海赛区-民宿空置预测-排行榜
  9. assm的结构_Oracle ASSM三级位图块结构
  10. Kubernetes:全面了解 Deployment
  11. ZOJ 1057 Undercut(简单模拟)
  12. 2021年安徽普通高考考试成绩查询,安徽省教育招生考试院:2021年安徽高考查分入口、查分系统...
  13. oracle中asmcmd,ASM工具asmcmd
  14. java jtextarea滚动条下滑,关于JTextArea的滚动条问题
  15. 5行Python 代码就能让你的电脑永不息屏
  16. 关闭或修改 IIS 443 端口
  17. Mybatis和Spring整合逆向工程
  18. python error:‘mbcs‘ codec can‘t encode
  19. STM32F4时钟系统
  20. shp2sdo的下载及使用说明

热门文章

  1. Android安全检测 - 动态注册Receiver风险
  2. 选择努力,就要不去放弃
  3. 压缩算法——JPEG2000 编解码原理
  4. 北京大学OJ-1006源码
  5. 怎么实现金额转换,将阿拉伯数字金额转换成中国传统形式,例如1011变成一千零一拾一元整?
  6. 计算机一级考试理论题第5套,计算机等级考试一级windows笔试模拟试题5套
  7. C语言练习:显示一个月的提醒列表
  8. highlight的用法
  9. springboot ajax下载文件功能封装
  10. DP [Sdoi2010]地精部落