引用
大家注意!这篇文章的思考有问题。当dest < source的时候,采取从高位向低位赋值,是有问题的,如果dest+count-1 > source && dest < source的情况。
先看实现:
void* memcpy(void* dest, void* source, size_t count)
{
void* ret = dest;
//copy from lower address to higher address
while (count--)
*dest++ = *source++;
return ret;
}
void* memmove(void* dest, void* source, size_t count)
{
void* ret = dest;
if (dest <= source || dest >= (source + count)) {
//Non-Overlapping Buffers
//copy from lower addresses to higher addresses
while (count --)
*dest++ = *source++;
}
else {
//Overlapping Buffers
//copy from higher addresses to lower addresses
dest += count - 1;
source += count - 1;
while (count--)
*dest-- = *source--;
}
return ret;
}
注意区别:
memcpy需要保证复制以后,原有数据source不被破坏。
memmove有移动的意思,原有数据可能,注意是可能被破坏掉。但memmove不清除原有数据。
但我有一个想法:memmove的实现显然有累赘的代码,其实无论区域是否重叠,用高位向低位复制的方法肯定不会有问题,又何苦要用if...else呢,按如下代码即可:
void* memmove(void* dest, void* source, size_t count)
{
void* ret = dest;
//Think of Overlapping Buffers
//copy from higher addresses to lower addresses
dest += count - 1;
source += count - 1;
while (count--)
*dest-- = *source--;
return ret;
}
我想,之所以采用判断的方式分别进行,主要是展现一下move的思路,增强可读性吧,当两个区域不会重叠的时候,memmove和memcpy是等价的。
通过实现方法可以看出:move并未清除原有数据。但move比cpy更安全,在使用cpy的时候,一定要考虑区域重叠的问题,另外还要考虑缓冲区溢出的问题啊。
还要知道memncpy能确保缓冲区不溢出。但要根据你的情况,如果char *str_source="hello", char buf[1024]的话,你用memcpy就可以了。用memncpy是没必要的。还可以用strcpy,更方便,毕竟已经确保不可能溢出了。
分享到:
相关推荐
DPDK中的memcpy性能优化及思考.pdf
memcpy 和strcpy 的区别
那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你有没有好好的参加过一场C++笔试。让你写出memcpy的实现,这是多么常见的笔试题啊。现在,拿起你的演算纸和笔;是的,是笔和纸,...
今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同。 memcpy和memmove在MSDN的定义如下: 从两者的声明来看的确没有区别,我们来...
memcpy: 头文件,函数原型,函数功能,函数返回值,说明
本文详细介绍了Memset、Memcpy、Strcpy 的作用及三者的区别,函数原型及使用技巧等。
c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 void* memcpy(void* destination, const void* source, size_t num); void*...
linux内核源码:memcpy,对比这个就发现了自己的不足,memcpy真能考验程序员的编程技能与逻辑思维
。虽然因为硬件限制没有达到AMD文档中所说memcpy函数300%的性能提升,但在我机器上实测也有%175-%200的明显性能提升(此数据可能根据机器情况不同)。
一个使用memcpy的实现版本,考虑内存重叠以及效率
网上参考资料写的memcpy以及strcpy的源码,希望能帮助大家。
问题:函数memcpy(dest, src, sizeof(dest))、strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), “%s”, src)都可以将src字符串中的内容拷贝到dest字符串中。哪一种方式效率最高呢?就是说,哪种...
memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域)
C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识。 1、strcpy和strncpy函数 这个不陌生,大一学...
C++执行内存memcpy的效率测试
不调用C库函数实现memmove-memcpy函数功能。
memcpy_sse 使用SSE2加载/存储内部指令的memcpy()。 与VC ++一起为32位编译时,它的性能优于memcpy()。 当为64位编译时,它的性能与memcpy()相同,因为所有x86-64芯片都支持SSE,因此memcpy()已被实现。 ...
网络渗透——BSD的memcpy溢出利用技术 内部安全资料,欢迎下载......................