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;
}