ptr::copy() 与 ptr::copy_nonoverlapping() 函数

这两个函数都用于将一块内存从 src 拷贝到目的地址.

pub const unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize);

pub const unsafe fn copy_nonoverlapping<T>(
    src: *const T,
    dst: *mut T,
    count: usize
);

它们的区别在于:

  • copy() 中的 src 和 dst 是可以有内存重叠的, 类似于 C 语言中的 memmove()
  • copy_nonoverlaping() 中的 src 和 dst 不可以有内存重叠, 类似于 C 语言中的 memcopy()

看一个例子:

use std::ptr;

fn main() {
    let src = b"hello";
    let mut dst = b"world".to_vec();

    unsafe {
        ptr::copy(
            ptr::from_ref(&src[0]),
            ptr::from_mut(&mut dst[0]),
            src.len(),
        );
    }
    assert_eq!(dst, src);

    unsafe {
        ptr::copy_nonoverlapping(ptr::from_ref(&src[0]), ptr::from_mut(&mut dst[4]), 1);
    }
    assert_eq!(dst[4], b'h');
}

对应的 C 语言的实现:

#include <assert.h>
#include <string.h>
#include <stdlib.h>

int main() {
  const char src[] = "hello";
  char dst[] = "world";
  memmove(dst, src, strlen(src));
  assert(strcmp(dst, "hello") == 0);

  memcpy(&dst[4], src, 1);
  assert(dst[4] == 'h');

  return 0;
}