[电池电源管理] 面试时问到如何实现memcpy,要怎么样回答

[复制链接]
2112|11
 楼主| 雾里闲逛 发表于 2025-5-30 09:05 | 显示全部楼层 |阅读模式
面试的时候,面试官问到了这个问题。
我回答是使用for循环来按字节拷贝。
我觉得这个问题应该还有一些潜在的问题,大家给些建议

谢谢
星辰伴梦 发表于 2025-8-4 16:12 | 显示全部楼层
你的回答是基本正确的,但面试官可能还想了解你对内存对齐和优化的理解。可以补充说,使用for循环按字节拷贝是最基础的方法,但在实际应用中,我们通常会考虑内存对齐和使用更高效的拷贝方法,比如使用`memcpy`函数本身,或者利用SIMD指令集进行优化。
xiaoqizi 发表于 2025-8-5 20:49 | 显示全部楼层
逐字节复制是最直观的方式,适用于所有场景,但效率较低。核心思想是通过字符指针逐个复制字节
木木guainv 发表于 2025-8-5 22:32 | 显示全部楼层
利用CPU的字长进行块传输,减少循环次数以提高效率
Jiangxiaopi 发表于 2025-8-6 07:58 | 显示全部楼层
void* my_memcpy_opt(void* dest, const void* src, size_t n) {
    if (!dest || !src) return NULL;
    // 先按4字节块复制
    unsigned long* d_long = (unsigned long*)dest;
    const unsigned long* s_long = (const unsigned long*)src;
    while (n >= sizeof(unsigned long)) {
        *d_long++ = *s_long++;
        n -= sizeof(unsigned long);
    }
    // 处理不足4字节的部分
    unsigned char* d_char = (unsigned char*)d_long;
    const unsigned char* s_char = (const unsigned char*)s_long;
    while (n--) {
        *d_char++ = *s_char++;
    }
    return dest;
}


荣陶陶 发表于 2025-8-6 09:42 | 显示全部楼层
当源与目标区域存在交集时,必须调整复制方向以避免覆盖未处理的数据
Zhiniaocun 发表于 2025-8-6 11:31 | 显示全部楼层
void* my_memcpy_full(void* dest, const void* src, size_t n) {
    if (!dest || !src) return NULL;
    // 检查是否重叠
    if ((uintptr_t)dest > (uintptr_t)src && (uintptr_t)dest < (uintptr_t)src + n) {
        // 重叠且需要反向复制
        char* d = (char*)dest + n - 1;
        const char* s = (const char*)src + n - 1;
        while (n--) *d-- = *s--;
    } else {
        // 无重叠,正向高效复制
        unsigned long* d_long = (unsigned long*)dest;
        const unsigned long* s_long = (const unsigned long*)src;
        while (n >= sizeof(unsigned long)) {
            *d_long++ = *s_long++;
            n -= sizeof(unsigned long);
        }
        // 剩余字节处理
        char* d_byte = (char*)d_long;
        const char* s_byte = (const char*)s_long;
        while (n--) *d_byte++ = *s_byte++;
    }
    return dest;
}


Zuocidian 发表于 2025-8-6 13:34 | 显示全部楼层
边界测试:传入 [size=0.875]NULL 指针、长度为0的情况
Puchou 发表于 2025-8-6 15:27 | 显示全部楼层
通过判断地址关系决定复制方向,确保不会因覆盖导致数据错误
Xiashiqi 发表于 2025-8-6 17:10 | 显示全部楼层
比较逐字节与批量复制在大数组下的耗时差异
小海师 发表于 2025-8-6 18:53 | 显示全部楼层
自动检测重叠、混合使用批量与单字节复制、兼容任意内存布局
Haizangwang 发表于 2025-8-6 20:46 | 显示全部楼层
未禁用中断进行跳转的话,
跳转过程中可能会被中断干扰

您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

47

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部