memcpy函数实现及其优化
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函数实现及其优化相关推荐
- memcpy函数优化及DMA对比
一.背景与目的 优化算法结构,提高芯片的使用效率,挖掘芯片的潜在能力,对提高产品质量,降低产品成本有着重要意义,在性能受限的嵌入式设备更加重要. 在使用C语言编程时,我们常用memcpy来复制内存数据 ...
- memcpy函数_[PART][BUG][MSVCRT][C][CCF NOI1097] 关于memcpy的坑
[Incompleted] CCF NOI1097 试题,本人的源码: Ubuntu Pastebinpaste.ubuntu.com Ubuntu Pastebin Ubuntu Pastebin ...
- resize函数查表优化
接着OpenCV的resize函数优化写,对于输入输出图像大小已知,且通道数相同的resize操作,可以使用查表的方法来进行优化,先生成输出图像中每个点对应原图的位置,然后拷贝原图像素点到目标图像. ...
- memcpy函数与memmove函数
1.1 memcpy函数是C语言内存拷贝函数,功能是从原内存地址的起始位置开始依次拷贝若干个字节到从目标地址的起始位置开始依次向后的若干个字节中. void* memcpy(void* dest,co ...
- memcpy 函数实现
memcpy函数的作用: 将由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回一个指向dest的指针. 想必大多数人在面试时被要求写 memcpy的实现 ...
- C++实现memcpy函数
实现memcpy函数 首先是函数接口的实现: void mymemcpy(void* dst, const void* src, size_t num) 这里使用了void*作为指针类型,接口更加通用 ...
- memcpy()函数
1.memcpy()函数的实现 void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开始拷贝n个字节到目标des ...
- 最保险的函数间数组作为参数值传递与返回方法,用memcpy函数
举例代码如下: void mycvCalcHist(IplImage *img,double out_hist[256]) {int i=0, j=0; double temp1=0;int temp ...
- 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 ...
最新文章
- 泛前端知识图谱(Web/iOS/Android/RN)
- 一次 MySQL 千万级大表的优化过程
- ThinkPHP 模板循环输出 Volist 标签
- 读-福瑞哈哥-的POE学习笔记
- 推荐两个Firefox插件
- Navicat使用教程:在Navicat Monitor for MySQL/MariaDB中配置实
- ASC0106硬件连接注意事项
- 第三届山东大数据-威海赛区-民宿空置预测-排行榜
- assm的结构_Oracle ASSM三级位图块结构
- Kubernetes:全面了解 Deployment
- ZOJ 1057 Undercut(简单模拟)
- 2021年安徽普通高考考试成绩查询,安徽省教育招生考试院:2021年安徽高考查分入口、查分系统...
- oracle中asmcmd,ASM工具asmcmd
- java jtextarea滚动条下滑,关于JTextArea的滚动条问题
- 5行Python 代码就能让你的电脑永不息屏
- 关闭或修改 IIS 443 端口
- Mybatis和Spring整合逆向工程
- python error:‘mbcs‘ codec can‘t encode
- STM32F4时钟系统
- shp2sdo的下载及使用说明