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