`

“关于memcpy和memmov的区别”的思考

阅读更多
引用
大家注意!这篇文章的思考有问题。当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,更方便,毕竟已经确保不可能溢出了。
1
1
分享到:
评论

相关推荐

    DPDK中的memcpy性能优化及思考.pdf

    DPDK中的memcpy性能优化及思考.pdf

    memcpy 和strcpy 的区别

    memcpy 和 strcpy 的区别 memcpy 和 strcpy 都是标准 C 库函数,都是用于从一块内存复制一段连续的数据到另一块内存,但是它们之间存在一些关键的区别。 首先,strcpy 函数用于复制字符串,它从源字符串的起始地址...

    C++中memcpy和memmove的区别总结

    那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你有没有好好的参加过一场C++笔试。让你写出memcpy的实现,这是多么常见的笔试题啊。现在,拿起你的演算纸和笔;是的,是笔和纸,...

    关于memcpy和memmove的一点重要说明

    今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同。 memcpy和memmove在MSDN的定义如下: 从两者的声明来看的确没有区别,我们来...

    memcpy, memcpy()函数,字符串拷贝

    memcpy: 头文件,函数原型,函数功能,函数返回值,说明

    Memset、Memcpy、Strcpy 的作用和区别

    本文详细介绍了Memset、Memcpy、Strcpy 的作用及三者的区别,函数原型及使用技巧等。

    C语言中memcpy 函数的用法详解

    c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 void* memcpy(void* destination, const void* source, size_t num); void*...

    linux memcpy源码

    linux内核源码:memcpy,对比这个就发现了自己的不足,memcpy真能考验程序员的编程技能与逻辑思维

    memcpy 优化---性能大幅提升几倍

    。虽然因为硬件限制没有达到AMD文档中所说memcpy函数300%的性能提升,但在我机器上实测也有%175-%200的明显性能提升(此数据可能根据机器情况不同)。

    memcpy函数的实现

    一个使用memcpy的实现版本,考虑内存重叠以及效率

    memcpy和strcpy源码

    网上参考资料写的memcpy以及strcpy的源码,希望能帮助大家。

    字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较

    问题:函数memcpy(dest, src, sizeof(dest))、strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), “%s”, src)都可以将src字符串中的内容拷贝到dest字符串中。哪一种方式效率最高呢?就是说,哪种...

    memcpy的用法

    memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域)

    C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识。 1、strcpy和strncpy函数 这个不陌生,大一学...

    C++执行内存memcpy的效率测试

    C++执行内存memcpy的效率测试

    不调用C库函数实现memmove-memcpy函数功能

    不调用C库函数实现memmove-memcpy函数功能。

    memcpy_sse:使用SSE2 loadstore instrinsics的memcpy()

    memcpy_sse 使用SSE2加载/存储内部指令的memcpy()。 与VC ++一起为32位编译时,它的性能优于memcpy()。 当为64位编译时,它的性能与memcpy()相同,因为所有x86-64芯片都支持SSE,因此memcpy()已被实现。 ...

    网络渗透——BSD的memcpy溢出利用技术

    网络渗透——BSD的memcpy溢出利用技术 内部安全资料,欢迎下载......................

Global site tag (gtag.js) - Google Analytics