C++ memcpy内存重叠

可以先看看Wiki百科对memcpy及memmove的解释

名称说明
void *memcpy(void *dest, const void *src, size_t n);将n字节长的内容从一个内存地址复制到另一个地址;如果两个地址存在重叠,则最终行为未定义
void *memmove(void *dest, const void *src, size_t n);将n字节长的内容从一个内存地址复制到另一个地址;与memcpy不同的是它可以正确作用于两个存在重叠的地址
void *memset(void *, int, size_t);用某种字节内容覆写一段内存空间

如果要做优化的话,可以这样做,保证一次复制4 bytes而不是一次1 byte,毕竟一次复制4 bytes的效率高于一次复制1 byte的效率

void memcpy(void* dest, void* src, int size)
{
    //assert(NULL != dest && NULL != src);
    uint8_t *pdest = (uint8_t*) dest;
    uint8_t *psrc = (uint8_t*) src;

    int loops = (size / sizeof(uint32_t));
    for(int index = 0; index < loops; ++index)
    {
        *((uint32_t*)pdest) = *((uint32_t*)psrc);
        pdest += sizeof(uint32_t);
        psrc += sizeof(uint32_t);
    }

    loops = (size % sizeof(uint32_t));
    for (int index = 0; index < loops; ++index)
    {
        *pdest = *psrc;
        ++pdest;
        ++psrc;
    }
}

如果要保证处理内存重叠的话,可以使用memmove,memmove的实现如下

void* memmove(void* dst, void* src, size_t size)
{
    char* pdst = (char*)dst;
    char* psrc = (char*)src;
    if(pdst>psrc && psrc + size > pdst)
    {
        pdst += size - 1;
        psrc += size - 1;
        while(size--)
            *pdst-- = *psrc--;
    }
    else
    {
        while(size--)
            *pdst++ = *psrc++;
    }
}

顺便带上memset吧,这三个库函数都是比较常见的

void* memset(void* s, int c, size_t size)
{
    uint8_t* ps = (uint8_t*)s;
    while(size--)
        *ps++ = (uint8_t)c;
    return s;
}

stackoverflow上的说明
注意:为了使用uint8_t类型,需要#include<inttypes.h>#include<stdint.h>