本文主要是介绍15. C++ memcpy和memmove,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. memcpy和memmove
函数原型:
void *memcpy(void *dest, const void* src, size_t count );
void *memmove(void *dest, const void* src, size_t count );
1.1 memcpy和memmove相同点
都是用于从src拷贝count个字节到dest。
1.2 memcpy和memmove区别
如果目标区域和源区域有重叠的话:
- memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
- memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。
但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。
memmove的处理措施:
(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
1.3 Linux下的实现过程
linux下,两个函数都在头文件string.h中定义,函数原型为:
void * _cdec1 memcpy(void * dst, const void* src, size_t count);
void * _cdec1 memmove(void* dst, const void* src, size_t count);void* _cdec1 memcpy(void* dst, const void* src, size_t count) {void *ret = dst;// 注意, memcpy函数没有处理dst和src区域是否重叠的问题while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return (ret);
}void _cdec 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区域没有重叠时,两个函数是完全一样的。否则,memcpy不能正常工作的,memmove是可以正常工作的。
这篇关于15. C++ memcpy和memmove的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!