C++ memcpy和memmove实现
memcopy和memmove函数在linux下看了一下两个函数的源码。
两个函数都在头文件string.h中定义,函数原型为:
void * __cdecl memcpy ( void * dst,const void * src,size_t count);
void * __cdecl memmove ( void * dst,const void * src,size_t count);
实现代码如下:
void * __cdecl memcpy ( void * dst,const void * src,size_t count)
{void * ret = dst;while (count--){ // 注意, memcpy函数没有处理dst和src区域是否重叠的问题*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}
void * __cdecl memmove ( void * dst,const void * src,size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)){ // 若dst和src区域没有重叠,则从起始处开始逐一拷贝while (count--){*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}}else{ // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突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);
}
总结一下:
当src和dst区域没有重叠时,两个函数是完全一样的。没有重叠的条件是:dst <= src || (char *)dst >= ((char *)src + count
。否则,memcpy是不能正常工作的,memmove是可以正常工作的。因为memcpy不需要判断重叠,所以它运行速度比memmove快,在确定dst和src不重叠的情况下,可以用memcpy。
C++ memcpy和memmove实现相关推荐
- strcpy,memcpy和memmove区别
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
一.函数介绍: 1.memcpy 函数原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include< ...
- memcpy 头文件_C|memcpy()和memmove()的比较及实现
memcpy()和memmove()函数的原型如下: void * memcpy ( void * dst, const void * src, size_t num ); void * memmov ...
- C和指针之字符串memcpy、memmove、memset使用总结
1.介绍memcpy.memmove.memset 1) void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开 ...
- memcpy、memmove、memset、memchr、memcmp、strstr详解
第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...
- 关于memcpy和memmove两函数的区别
http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plain copy <p> 关于memcpy和m ...
- memcpy和memmove的区别以及内存重叠问题
memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...
- C语言学习笔记---数据拷贝函数memcpy()和memmove()函数
在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...
- memcpy、memmove、memcmp、memset函数的使用说明和模拟实现
在前面的文章中,我已经对字符串函数进行了详细的介绍和模拟实现,今天,我来讲解另一类函数----------内存函数. 这里写目录标题 memcpy函数 memmove函数 memcmp函数 memse ...
- memcpy、memmove
前言 一.memcpy 1.介绍 2.使用 3.模拟实现 二.memmove 1.介绍 2.模拟实现 三.总结 前言 上一文,学习了字符串相同函数的使用,在某些场合,数据的类型不限于字符串,有可能是整 ...
最新文章
- 《用Python进行自然语言处理》第2章 获得文本语料和词汇资源
- QTableWidget表头样式
- BZOJ4241 历史研究(莫队)
- HashMap和Hashtable
- spring-kafka整合:DefaultKafkaProducerFactory默认kafka生产者工厂介绍
- 你如何摆平秋季问题皮肤
- TF-IDF 提取文本关键词
- 如何利用php下载文件_PHP使用文件流下载文件方法
- zynq文档阅读之GPIO的中断
- MYSQL 无重复插入数据更新语法 sql一句话使insert时若主键重复则更新
- AHP(层次分析法)的全面讲解及python实现
- 概率论基础-严士健 第二版 习题与补充1.6答案
- 小程序图片实现自适应大小,超过部分自动裁剪
- js实现动态星空背景
- (转)The Neural Network Zoo
- 论文阅读《API2Com: On the Improvement of Automatically Generated Code Comments Using API Documentations》
- NavigationController
- 如何判断是否受到DDOS攻击?被攻击该如何解决?
- 如何改变坏习惯,形成新习惯
- VS源文件提取工具vsjuicer 实现细节
热门文章
- python编程培训多少钱-python编程培训多少钱?[python培训]
- python处理excel字典-python从excel创建字典
- python字符串写入excel-使用python将数据写入excel
- python语言命令大全-Python常用命令之集合
- python能处理多大的数据-Python 适合大数据量的处理吗?
- python timer使用-Python timer定时器两种常用方法解析
- RequestBodyAdvice和ResponseBodyAdvice
- LeetCode Kth Smallest Element in a BST(中序遍历)
- 英文文献中的一些单词
- tip use view.isineditmode() in your custom views to skip code when shown in eclipse