C++ memcpy、memmove

函数原型:

void *memcpy(void *dest, const void* src, size_t count );
void *memmove(void *dest, const void* src, size_t count );

memcpy和memmove相同点:

  1. 都是用于从src拷贝count个字节到dest

memcpy和memmove区别:

如果目标区域和源区域有重叠的话:

  1. memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
  2. memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

Linux下的实现过程:

void* _cdec1 memcpy(void* dst, const void* src, size_t count) {
	void *ret = dst;
    // 注意, memcpy函数没有处理dst和src区域是否重叠的问题
    while (count--) {
	*(char *)dst = *(char *)src;
        dst = (char *)dst + 1;
        src = (char *)src + 1;
    }
    return (ret);
}

void _cdec memmove(void* dst, const void* src, size_t count) {
    void* ret = dst;
    if (dst <= src || (char *)dst >= ((char *)src + count)) {
        // 若dst和src区域没有重叠,则从起始处开始逐一拷贝
        while (count--) {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }
    else {
        // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
        dst = (char *)dst + count - 1;
        src = (char *)src + count - 1;
        while (count--) {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }
    return (ret);
}
posted @ 2024-03-19 18:43  小熊酱  阅读(58)  评论(0)    收藏  举报