C语言重写 memcpy 函数

在重写 memcpy() 函数时,需要注意以下几个问题:

  1. 类型转换:memcpy() 函数接受 void* 类型的参数,这意味着它可以接受任何类型的指针。但在复制数据时,我们需要将其转换为 char* 类型,因为 char 是 1 字节,这样我们可以按字节复制数据。
  2. 边界检查:memcpy() 不会检查目标内存区域是否有足够的空间来存储源数据。如果目标内存区域不够大,这可能会导致缓冲区溢出,这是一种严重的安全问题。因此,虽然标准的 memcpy() 函数不进行这种检查,但在你的实现中可能需要考虑这个问题。
  3. 重叠区域:如果源内存区域和目标内存区域重叠,memcpy() 的行为是未定义的。如果你的实现需要处理这种情况,你应该使用 memmove() 函数,或者在复制数据之前检查源和目标是否重叠。
  4. 返回值:memcpy() 函数应该返回指向目标内存区域的指针。这允许函数调用可以被链接,例如 memcpy(dest, src, n)[0] = 'a';。
  5. 错误处理:memcpy() 函数没有内置的错误处理机制。如果发生错误(例如,无法访问源或目标内存区域),你的实现应该有一种方法来报告这个错误。

  • 使用循环展开的效率优化版本:
void* my_memcpy(void* dest, const void* src, size_t n) {
    char* cdest = (char*) dest;
    const char* csrc = (const char*) src;

    // 循环展开,每次复制 4 个字节(uint32_t)
    size_t loops = n / 4;
    for (size_t i = 0; i < loops; i++, cdest += 4, csrc += 4) {
        *(uint32_t*)cdest = *(uint32_t*)csrc;
    }

    // 复制剩余的字节
    loops = n % 4;
    for (size_t i = 0; i < loops; i++, cdest++, csrc++) {
        *cdest = *csrc;
    }

    return dest;

全部评论

相关推荐

烤点老白薯:这种东西到时候公众号搜索都有的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务