pub unsafe fn copy_nonoverlapping(src: *const T, dst: *mut T, count: usize)
将 count * size_of::() 个字节从 src 复制到 dst。来源和 目的地不得重叠
我要写的数据位于索引
buf
的4
中,我想在(变量)索引_bytes_buff
的index * MAX_DATA_LENGTH
中写入它。 MAX_DATA_LENGTH
大约是 64Kb.
但是我在让它工作时遇到了一些麻烦。请参阅下面我当前尝试正确编写它的片段:
let mut _bytes_buf:Vec<u8>; // big buffer, we don't know the total size at compilation
let mut buf = [0u8; MAX_DATA_LENGTH]; // small buffer
// [...] we now know the size, I write '3' below to make it simple
let len:usize = MAX_DATA_LENGTH * 3 as usize;
_bytes_buf = Vec::with_capacity(len); // any difference with !vec[0; len] ?
unsafe { _bytes_buf.set_len(len); }
// [...] each time buf has a different content and index is either 0, 1 or 2.
unsafe {
let dst_ptr = &_bytes_buf[index * MAX_DATA_LENGTH].offset(MAX_DATA_LENGTH as isize);
let src_ptr = &buf[4];
ptr::copy_nonoverlapping(src_ptr, dst_ptr, MAX_DATA_LENGTH);
}
我怎样才能让它工作(最后一个不安全的块)?我找到了很多信息,但有些信息已被弃用或过时,所以我正在寻找从 2021 年开始的方法。
此外,如果这不是最佳方法(
copy_nonoverlapping
),我将非常感谢了解更多有关我应该如何做的信息!
Rust 的安全版本
memcpy
是 <[u8]>::copy_from_slice
:
const MAX_DATA_LENGTH: usize = 64000;
let mut bytes_buf = vec![0u8; MAX_DATA_LENGTH * 3];
let buf = [0u8; MAX_DATA_LENGTH];
let index = 0;
bytes_buf[index*MAX_DATA_LENGTH..(index+1)*MAX_DATA_LENGTH-4].copy_from_slice(&buf[4..]);
copy_nonoverlapping
,这是怎么做的:
unsafe {
let dst_ptr = &mut bytes_buf[index*MAX_DATA_LENGTH] as *mut u8;
let src_ptr = &buf[4] as *const u8;
std::ptr::copy_nonoverlapping(src_ptr, dst_ptr, MAX_DATA_LENGTH-4);
}
但是,除非有必要,否则不要使用
unsafe
,并且您了解需要确保的安全保证safe.