关于memory的三个函数,再说一点点

本文探讨了一个自定义内存复制函数的问题,该函数旨在提高复制效率。文章对比了不同字节数的复制过程,并提供了两种实现方式:一种直接使用指针进行类型转换并递增,另一种通过拆分为多种固定字节数的复制函数来实现。最终给出了一种更清晰简洁的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过修改,现在写成了这个样子:

#include<stdio.h>
#include<stdlib.h>
int memorycpy(void *dst,void *src,size_t n)
{
    size_t k;
    size_t i;
    if(n>=8){
        k=n;
        k>>=3;
        for(i=0;i<k;i++)
        *((long long*)dst++)=*((long long*)src++);
        n-=8*k;
    }
    if(n>=4){
        k=n;
        k>>=2;
    *((long*)dst++)=*((long*)src++);
        n-=4*k;
    }
    if(n>=2){
        k=n;
        k>>=1;
    *((short*)dst++)=*((short*)src++);
        n-=2*k;
    }
    if(n>=1){
        k=n;
    *((char*)dst++)=*((char*)src++);
    }
}
int main()
{
    char* src="1234567890";
    char* dst=(char*)malloc(11);
    memorycpy(dst,src,sizeof(src));
    printf("%s/n",dst);
    return 0;
}   

 

gcc编译能通过,但是运行结果不对,src小于或等于四字节时能打印出相应的字节,而大于四字节时还是只显示四字节,郁闷。

 

标记红色的地方语法到底对不对呢?在vc中为什么编译不过?对于红色的行显示error C2036: 'void *' : unknown size,这样到底能不能把dst先转换类型而后再自增1呢?

 

渴望高人指点。


 

老大写的确是好:

static int __memcpy_1byte__(void * dst, const void * src, size_t n)
{
    UI08 * d = dst;
    const UI08 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

static int __memcpy_2byte__(void * dst, const void * src, size_t n)
{
    UI16 * d = dst;
    const UI16 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

static int __memcpy_4byte__(void * dst, const void * src, size_t n)
{
    UI32 * d = dst;
    const UI32 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

static int __memcpy_8byte__(void * dst, const void * src, size_t n)
{
    UI64 * d = dst;
    const UI64 * s = src;

    while(n --)
    {
        * d ++ = * s ++;
    }
       
    return 0;
}

int memorycpy(void * dst, const void * src, size_t n)
{
    size_t i;
    BYTE * d = dst;
    const BYTE * s = src;

    i = n >> 3;
    if(i != 0)
    {
        __memcpy_8byte__(d, s, i);
        d = d + (i << 3);
        s = s + (i << 3);
        n = n - (i << 3);
    }
   
    i = n >> 2;
    if(i != 0)
    {
        __memcpy_4byte__(d, s, i);
        d = d + (i << 2);
        s = s + (i << 2);
        n = n - (i << 2);
    }

    i = n >> 1;
    if(i != 0)
    {
        __memcpy_2byte__(d, s, i);
        d = d + (i << 1);
        s = s + (i << 1);
        n = n - (i << 1);
    }

    if(n != 0)
    {
        __memcpy_1byte__(d, s, n);
    }

    return 0;
}

 

其中,UI08、UI16、UI32、UI64分别是unsigned char、unsigned short、unsigned long和unsigned long long,BYTE是unsigned char。

这样写,确实既清晰又简洁,真好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值