【memcopy】

完整的实现如下:

#include<assert.h>
#include<cstddef>
#include<iostream>
void *memcpy(void* dst,const void *src,size_t num)
{
    assert((dst!=NULL)&&(src!=NULL));
    size_t word_num = num/sizeof(long);
    size_t slice = num%sizeof(long);
    if((src<dst)&&((char*)src+num > (char*)dst))//对应于情况3
    {
        if(word_num>0)                              //要拷贝的空间大于等于一个long的情况!
        {
            long *psrc = (long*)((char*)src+num-sizeof(long));
            long *pdst = (long*)((char*)dst+num-sizeof(long));
            while(word_num--)
                *pdst-- = *psrc--;
            while(slice--)
                *((char*)pdst--) = *((char*)psrc--);
        }
        else                                        //要拷贝的空间小于一个long的情况!
        {
            char *psrc = (char*)src+num-1;
            char *pdst = (char*)dst+num-1;
            while(slice--)
                *((char*)pdst--) = *((char*)psrc--);
        }
    }
    else                                        //对应于情况1,2,4
    {
        long *pdst = (long*)dst;
        long *psrc = (long*)src;
        while(word_num--)
            *pdst++ = *psrc++;
        while(slice--)
            *((char*)pdst++) = *((char*)psrc++);
    }
    return dst;
}
 
int main()
{
    char src[101]="1234567890";
    char dst[101];
    memcpy(dst,src,10);
    for(int i=0;i<101;i++)
    {
        std::cout<<src[i]<<" ";
    }
}

具体可以看这个博客:

---------------------

作者:一座青山

来源:优快云

原文:https://blog.youkuaiyun.com/sangyongjia/article/details/57989019

版权声明:本文为博主原创文章,转载请附上博文链接!

<think>嗯,用户问的是C++中的memcpy,需要详细介绍一下。首先,我得确认memcpy的基本信息,比如它是C标准库里的函数,C++中也可以使用,包含在<cstring>头文件里。然后,功能方面,memcpy用于内存块的二进制复制,不关心数据类型,直接按字节拷贝。参数有三个:目标指针、源指针、要复制的字节数。 接下来,用户可能需要知道如何使用,比如示例代码。这时候要举一个简单的例子,比如复制整型数组或者结构体。不过要注意,如果源和目标内存有重叠的话,memcpy的行为是未定义的,这时候应该用memmove代替。这点很重要,容易出错,必须提醒用户。 另外,类型安全的问题,因为memcpy是void*指针,不进行类型检查,可能会引发问题,比如不同类型的指针误用。还有浅拷贝的问题,如果结构体里有指针成员,memcpy只会复制指针值,不会深拷贝指向的数据,可能导致双重释放或者悬空指针。 性能方面,memcpy通常由编译器优化,效率高,尤其是大块数据。但小数据可能不如直接赋值高效,比如单个int变量用memcpy反而更慢。 还要提到C++中的替代方案,比如std::copy,它更安全,支持类型检查,还能处理容器迭代器。可能用户是C++开发者,推荐使用更安全的方式。 需要检查是否有常见的错误,比如第三个参数计算错误,比如用sizeof指针而不是数组大小,导致复制不足。例如,int arr[5]应该用sizeof(int)*5,而不是sizeof(arr)如果传递的是指针的话。 最后,总结适用场景和注意事项,帮助用户正确使用。要结构清晰,分点说明,确保用户能逐步理解。</think>C++ 中 memcpy 函数使用详解(分步说明): 1. 基础概念 - memcpy 是 C 标准库函数(C++ 通过 <cstring> 头文件调用) - 用途:直接复制内存块的二进制数据 - 函数原型: $$void* memcpy(void* dest, const void* src, size_t count);$$ 2. 参数说明 ┌──────────┬───────────────────────────────┐ │ 参数 │ 说明 │ ├──────────┼───────────────────────────────┤ │ dest │ 目标内存地址(需已分配空间) │ │ src │ 源内存地址 │ │ count │ 要复制的字节数 │ └──────────┴───────────────────────────────┘ 3. 使用示例(代码演示) ```cpp #include <cstring> #include <iostream> int main() { int src[] = {1, 2, 3, 4, 5}; int dest[5]; // 计算总字节数:元素数量 × 单个元素大小 size_t byteCount = sizeof(src); memcpy(dest, src, byteCount); // 验证结果 for(int i=0; i<5; ++i) { std::cout << dest[i] << " "; } return 0; } ``` 4. 注意事项 (1) 内存重叠问题 - 当源内存与目标内存有重叠区域时,必须改用 memmove - 错误示例: ```cpp char str[] = "ABCDEF"; memcpy(str + 2, str, 4); // 未定义行为! ``` (2) 类型安全 - 不会进行类型检查 - 错误示例: ```cpp float f = 3.14f; int i; memcpy(&i, &f, sizeof(int)); // 二进制直接复制,可能产生意外结果 ``` (3) 浅拷贝风险 ```cpp struct Data { int* ptr; }; Data a{new int(10)}; Data b; memcpy(&b, &a, sizeof(Data)); // 现在 a.ptr 和 b.ptr 指向同一内存 ``` 5. 性能特点 - 优点:编译器优化的底层内存操作,适合大块数据复制 - 缺点:对小数据(如单个基本类型变量)效率可能低于直接赋值 6. C++ 替代方案 - 使用 std::copy(类型安全): ```cpp #include <algorithm> std::copy(src, src+5, dest); // 自动推断类型和元素数量 ``` 7. 常见错误 - 错误计算字节数: ```cpp int* arr = new int[10]; memcpy(dest, arr, sizeof(arr)); // 错误!sizeof(指针) ≠ 数组总大小 ``` 8. 适用场景推荐 ✅ 原始二进制数据传输 ✅ 自定义内存池管理 ✅ 网络数据包序列化 ❌ 需要深拷贝的对象 ❌ 存在内存重叠的情况 建议:在 C++ 中优先考虑类型安全的替代方案(如 std::copy, std::memcpy 模板封装),仅在需要底层内存操作时使用原始 memcpy。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值