函数重现系列导航
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;
}