C语言自己实现一个memcpy函数

发布于:2023-09-16 ⋅ 阅读:(49) ⋅ 点赞:(0)


在 C 语言中,我们可以自己实现 memcpy 函数来实现内存数据的拷贝操作。memcpy 函数用于将指定长度的数据从源地址复制到目标地址。

按字节拷贝实现memcpy

#include <stdio.h>

void* my_memcpy_byte(void* dst, const void* src, int n)
{
    if (dst == NULL || src == NULL || n <= 0)
        return NULL;

    char* pdst = (char*)dst;
    char* psrc = (char*)src;

	//判断目标内存区域和源内存区域是否有重叠
    if (pdst > psrc && pdst < psrc + n) 
    {
    	//如果有重叠,就从尾部开始遍历
        pdst = pdst + n - 1;
        psrc = psrc + n - 1;
        while (n--)
            *pdst-- = *psrc--;
    }
    else
    {
        while (n--)
            *pdst++ = *psrc++;
    }
    return dst;
}

int main(void)
{
    char str[] = "HelloWorld";

    char* str1 = &str[0];
    char* str2 = &str[1];

    my_memcpy_byte(str1, str2, 5);

    printf("%s\n", str); //输出elloWWorld

    return 0;
}

按4字节拷贝实现memcpy


#include <stdio.h>

void* my_memcpy_byte(void* dst, const void* src, int n)
{
    if (dst == NULL || src == NULL || n <= 0)
        return NULL;

    int* pdst = (int*)dst;
    int* psrc = (int*)src;

    char* pdstTemp = NULL;
    char* psrcTemp = NULL;
    int byte4Count = n / 4; //有多少个4字节,按4字节拷贝
    int byteCount = n % 4; //剩余字节数按字节拷贝

    //判断目标内存区域和源内存区域是否有重叠,如果有从后往前,如果没有从前往后
    if (pdst > psrc && pdst < (char*)psrc + n)
    {
        pdstTemp = (char*)pdst + n - 1;
        psrcTemp = (char*)psrc + n - 1;

        while (byteCount--)
        {
            *pdstTemp-- = *psrcTemp--;
        }

        pdstTemp++;
        psrcTemp++;

        pdst = (int*)pdstTemp;
        psrc = (int*)psrcTemp;

        pdst--;
        psrc--;

        while (byte4Count--)
        {
            *pdst-- = *psrc--;
        }

    }
    else
    {
        while (byte4Count--)
        {
            *pdst++ = *psrc++;
        }

        pdstTemp = (char*)pdst;
        psrcTemp = (char*)psrc;

        while (byteCount--)
        {
            *pdstTemp++ = *psrcTemp++;
        }
    }

    return dst;
}

int main(void)
{
    char str[] = "HelloWorld";

    char* str1 = &str[0];
    char* str2 = &str[1];

    my_memcpy_byte(str1, str2, 1);

    printf("%s\n", str);

    return 0;
}

Tips

对比字节拷贝,4字节拷贝速度是提高不少。
但是需要注意,void *dst, const void *src这两个参数是需要按4字节对齐的,如果本身不是4字节对齐,按4字节拷贝效率也会变低。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到