memcpy函数的实现方式

1、 memcpy函数的实现方式


void m_memcpy(void *pdest,const void *psrc,uint32_t size)
{
#define  DEF_NO                                            0u
#define  DEF_YES                                           1u

    uint32_t 		size_rem;
    uint32_t 		mem_gap_octets;
    uint32_t 		*pmem_align_dest;
    const  uint32_t *pmem_align_src;
    uint8_t 		*pmem_08_dest;
    const  uint8_t   *pmem_08_src;
    uint32_t 		i;
    uint32_t 		mem_align_mod_dest;
    uint32_t 		mem_align_mod_src;
    uint8_t 		mem_aligned;


    if (size < 1)return;
    if (pdest == (void*)0)return;
    if (psrc == (void*)0)return;


    size_rem           =  size;
    pmem_08_dest       = (      uint8_t *)pdest;
    pmem_08_src        = (const uint8_t *)psrc;
    mem_gap_octets     = pmem_08_src - pmem_08_dest;

    if (mem_gap_octets >= sizeof(uint32_t))//避免buf重叠
    {
        mem_align_mod_dest = (uint8_t)((uint32_t)pmem_08_dest % sizeof(uint32_t));
        mem_align_mod_src  = (uint8_t)((uint32_t)pmem_08_src  % sizeof(uint32_t));
        mem_aligned        = (mem_align_mod_dest == mem_align_mod_src) ? DEF_YES : DEF_NO;
		
        if ( mem_aligned == DEF_YES )
        {
            if (mem_align_mod_dest != 0)
            {
                i = mem_align_mod_dest;
                while( size_rem>0 && i<sizeof(uint32_t)  )
                {
                    *pmem_08_dest++ = *pmem_08_src++;
                    size_rem      -=  sizeof(uint8_t);
                    i++;
                }
            }
            //------4字节对齐后---------------------------------------
            pmem_align_dest = (      uint32_t *)pmem_08_dest;
            pmem_align_src  = (const uint32_t *)pmem_08_src;
            while (size_rem      >=  sizeof(uint32_t)) //4字节的复制
            {
                *pmem_align_dest++ = *pmem_align_src++;
                size_rem         -=  sizeof(uint32_t);
            }

            pmem_08_dest = (      uint8_t *)pmem_align_dest;
            pmem_08_src  = (const uint8_t *)pmem_align_src;
        }
    }

    //复制剩余的字节
    while (size_rem > 0)
    {
        *pmem_08_dest++ = *pmem_08_src++;
        size_rem      -=  sizeof(uint8_t);
    }
}

2、 测试

uint8_t test1_buf[1024],test2_buf[1024];
memset(test1_buf,0,sizeof(test1_buf));
memset(test2_buf,0,sizeof(test2_buf));
m_memcpy(test1_buf,test2_buf,sizeof(test2_buf));
if ( 0 == memcmp(test1_buf,test2_buf,sizeof(test2_buf)))
{
	PRINTF_HEAP_MEM("m_memcpy function ok\n");
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值