`

“关于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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics