【函数重现】- memmove 函数

函数重现系列导航


1. 函数简介

memmove 函数为 C 库函数之一,用于内存的拷贝。

  • 函数原型:void* memmove(void* dest, const void* src, size_t num);
  • 所属头文件:<string.h>
  • 功能:从 src 所指的内存地址的起始位置开始,拷贝 num 个字节的数据到目标 dest 所指的内存地址的起始位置中。
  • 返回:指向目标内存的指针。

2. 函数说明

  • 既然为 memmove 函数的重现,那么所重现的 memmove 函数的基本功能、调用方法应与原库函数保持一致。
  • memmove 函数支持内存覆盖,且能正确地完成内存覆盖,即能保证目标内存数据的完整性。这是 memmove 函数与 memcpy 函数的区别。
  • 内存拷贝时,除了逐字节拷贝外,还可以先以位宽为单位进行拷贝,剩余部分再以字节为单位拷贝,这样有效地提高了拷贝效率,因此重现时将使用该方法。

3. 函数重现

void* memmove(void* dest, const void* src, size_t num)
{
    // 如果两指针指向相同的内存地址,则直接返回即可
	if (dest == src)
	{
	    return dest;
	}

    // 计算出以位宽为最小单位的个数以及剩余部分的字节数
	int word_num = num / sizeof(size_t);
	int byte_slice = num % sizeof(size_t);
    
    if (src < dest)
	{		
		char* bdest = (char*)((char*)dest + num - 1);
		const char* bsrc = (char*)((char*)src + num - 1);
		
		// 按字节从后向前拷贝
		while (byte_slice--)
		{
			*bdest-- = *bsrc--;
		}
        
        size_t* wdest = (size_t*)((size_t*)dest + word_num - 1);
		const size_t* wsrc = (size_t*)((size_t*)src + word_num - 1);
		
		// 按位宽从后向前拷贝
		while (word_num--)
		{
			*wdest-- = *wsrc--;
		}
	}
	else
	{
		size_t* wdest = (size_t*)dest;
		const size_t* wsrc = (size_t*)src;
		
		char* bdest = (char*)((size_t*)dest + word_num);
		const char* bsrc = (char*)((size_t*)src + word_num);
		
		// 按位宽从前向后拷贝
		while (word_num--)
		{
			*wdest++ = *wsrc++;
		}	

		// 按字节从前向后拷贝
		while (byte_slice--)
		{
			*bdest++ = *bsrc++;
		}		
	}	
		
	return dest;
}
发布了60 篇原创文章 · 获赞 36 · 访问量 5925

猜你喜欢

转载自blog.csdn.net/qq_35692077/article/details/102642864