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>